class ModelA(models.Model):
views = models.PositiveBigIntegerField()
class ModelB(models.Model):
parent = models.ForeignKey(ModelA, on_delete=models.CASCADE, related_name='modelB', blank=True, null=True)
string = models.CharField()
class ModelAListView(generics.ListAPIView):
serializer_class = ModelASerialezer
queryset = ModelA.objects.all().prefetch_related('modelb')
def list(self, request, *args, **kwargs):
queryset = self.filter_queryset(self.get_queryset())
page = self.paginate_queryset(queryset)
if page is not None:
serializer = self.get_serializer(page)
return self.get_paginated_response(serializer.data)
serializer = self.get_serializer(queryset.filter(modelb__string__icontains=request.GET['string']), many=True)
return Response(serializer.data)
class ModelASerializer(serializers.ModelSerializer):
id = serializers.ReadOnlyField()
modelB = ModelBSerializer(source='modelB', many=True, read_only=False)
class Meta:
model = ModelA
exclude = ('views',)
class ModelBSerializer(serializers.ModelSerializer):
id = serializers.IntegerField(required=False)
class Meta:
model = ModelB
fields = '__all__'
modelA.objects.filter(modelB__string__icontains=request.GET['string']).values('modelB__string')
<QuerySet [{'modelB__string': 'Test1'}]>
{
"id": 1,
"views": 0,
"modelb": [
{
"id": 46,
"string": "Test1",
"item": 1
}
]
}
{
"id": 1,
"views": 0,
"modelb": [
{
"id": 46,
"string": "Test1",
"item": 1
},
{
"id": 47,
"string": "Test85",
"item": 1
},
{
"id": 48,
"string": "Test64",
"item": 1
}
]
}
--
You received this message because you are subscribed to the Google Groups "Django REST framework" group.
To unsubscribe from this group and stop receiving emails from it, send an email to django-rest-fram...@googlegroups.com.
To view this discussion on the web visit https://groups.google.com/d/msgid/django-rest-framework/e18c0ced-b487-4c03-b832-570f68b98d8e%40googlegroups.com.
For more options, visit https://groups.google.com/d/optout.
Такой фильтр фактически выберет каждый экземпляр ModelA, по крайней мере, с одним связанным экземпляром ModelB, который соответствует вашему фильтру. Фильтр не исключит в результирующем наборе запросов связанные экземпляры ModelB, которые не соответствуют фильтру.В четверг, 11 июля 2019 года в 06:41 Василий Русин < rus ... @ gmail.com > написал:
Если мне нужно искать по полю "строка", я могу написать:
modelA.objects.filter(modelB__string__icontains=request.GET['string']).values('modelB__string')
Которые возвращают экземпляры ModelB только с необходимыми строковыми значениями :<QuerySet [{'modelB__string': 'Test1'}]>Когда я фильтрую по modelb_string, я ожидаю получить только отфильтрованное значение FK:
{
"id": 1,
"views": 0,
"modelb": [
{
"id": 46,
"string": "Test1",
"item": 1
}
]
}
но я получаю все значения FK:
{
"id": 1,
"views": 0,
"modelb": [
{
"id": 46,
"string": "Test1",
"item": 1
},
{
"id": 47,
"string": "Test85",
"item": 1
},
{
"id": 48,
"string": "Test64",
"item": 1
}
]
}
-
Вы получили это сообщение, потому что вы подписаны на группу Google "Django REST framework".
Чтобы отписаться от этой группы и прекратить получать электронные письма от нее, отправьте электронное письмо по адресу django-rest-framework + unsub...@googlegroups.com .
Чтобы просмотреть это обсуждение в Интернете, посетите https://groups.google.com/d/ msgid / django-rest-framework / e18c0ced-b487-4c03-b832- 570f68b98d8e% 40googlegroups. ком .
Для получения дополнительной информации посетите страницу https://groups.google.com/d/ optout .
--
You received this message because you are subscribed to the Google Groups "Django REST framework" group.
To unsubscribe from this group and stop receiving emails from it, send an email to django-rest-fram...@googlegroups.com.
To view this discussion on the web visit https://groups.google.com/d/msgid/django-rest-framework/6b3e171e-10bf-4d5f-bbef-28f70fd2ff28%40googlegroups.com.