Wenn es immer noch ein Problem, könnte es sein, dass ItemResource hat auch ein oder mehr Felder zusammen. Wenn das der Fall ist, können Sie wahrscheinlich so etwas wie:
def get_object_list(self, request):
return super(CategoryResource, self).get_object_list(request).prefetch_related('items__relatedfield1', 'items__relatedfield2')
Beachten Sie, alle queryset Veränderungen wie select_related
oder prefetch_related
auf ItemResource
durchgeführt wird die Abfrage nicht für verwandte Modelle auf CategoryResource
beeinflussen.
UPDATE: Probieren Sie etwas wie folgt aus:
class CategoryResource(ModelResource):
items = fields.ToManyField('ItemResource', 'items', full=True, null=False, readonly=True, related_name='items')
class Meta:
queryset = Category.objects.all().order_by('id')
include_resource_uri = False
always_return_data = True
resource_name = 'category'
def get_object_list(self, request):
return super(CategoryResource, self).get_object_list(request) \
.prefetch_related('items', 'items__categories')
class ItemResource(ModelResource):
categories = fields.ToManyField(CategoryResource, 'categories', null=True, readonly=True)
def dehydrate_categories(self, bundle):
categories = items__item=bundle.obj.categories.all()
return [
category.name
for category in categories
if category.owner_id == bundle.request.user.id
]
OR:
class CategoryResource(ModelResource):
items = fields.ToManyField('ItemResource', 'items', full=True, null=False, readonly=True, related_name='items')
class Meta:
queryset = Category.objects.all().order_by('id')
include_resource_uri = False
always_return_data = True
resource_name = 'category'
def get_object_list(self, request):
return super(CategoryResource, self).get_object_list(request) \
.prefetch_related(
'items',
Prefetch('items__categories', queryset=Category.objects.filter(owner_id=bundle.request.user.id))
)
class ItemResource(ModelResource):
categories = fields.ToManyField(CategoryResource, 'categories', null=True, readonly=True)
def get_object_list(self, request):
return super(ItemResource, self).get_object_list(request) \
.prefetch_related(
Prefetch('categories', queryset=Category.objects.filter(owner_id=bundle.request.user.id))
)
def dehydrate_categories(self, bundle):
return [
category.name
for category in bundle.obj.categories.all()
]
Außerdem können Sie wahrscheinlich eine Listfield für ItemResource.categories statt ToManyField verwenden, da Sie manuell sind Handhabung der Dehydrierung.
Nicht für mich arbeiten - alles bleibt gleich – svfat
Show 'ItemResource' und Modelle –
EDIT: SO vermasselte meine Formatierung, so dass ich als eine andere Antwort posten. | Wenn es immer noch ein Problem gibt, könnte ItemResource auch ein oder mehrere verwandte Felder haben. Wenn das der Fall ist, können Sie wahrscheinlich so etwas wie: def get_object_list (self, Anfrage): return Super (CategoryResource, Selbst-) .get_object_list (Anfrage) .prefetch_related ('items__relatedfield1', 'items__relatedfield2') Haltungsart Denken Sie daran, dass Änderungen an Querysets wie "select_related" oder "prefetch_related", die für "ItemResource" ausgeführt werden, die Abfrage für verwandte Modelle in 'CategoryResource' nicht beeinflussen. –