我在django-rest-framework
中有问题过滤,我正在使用species_type='Cow'
来处理此序列化数据。
我想要的是让所有的畜群都记录动物可能有class Herd(models.Model):
name = models.CharField(max_length=25)
description = models.TextField(max_length=250, null=True)
created_at = models.DateTimeField(auto_now_add=True, editable=False)
updated_at = models.DateTimeField(auto_now=True, editable=False)
class Animal(models.Model):
name = models.CharField(max_length=25)
species_type = models.CharField(max_length=25)
breed = models.CharField(max_length=25)
herd = models.ForeignKey(Herd, related_name='animals', on_delete=models.CASCADE)
created_at = models.DateTimeField(auto_now_add=True, editable=False)
updated_at = models.DateTimeField(auto_now=True, editable=False)
或空畜群的动物。
这是我的模特。
models.py
class AnimalSerializer(serializers.ModelSerializer):
class Meta:
model = Animal
fields = [
'name',
'species_type',
'breed'
]
read_only_fields = ['id', 'created_at', 'updated_at']
class HerdSerializer(serializers.ModelSerializer):
animals = AnimalSerializer(many=True, read_only=True)
class Meta:
model = Herd
fields = [
'id',
'name',
'description',
'animals'
]
read_only_fields = ['created_at', 'updated_at']
serializers.py
class HerdViewset(viewsets.ModelViewSet):
"""
This viewset automatically provides `list`, `create`, `retrieve`,
`update` and `destroy` actions.
"""
queryset = Herd.objects.all()
serializer_class = HerdSerializer
这是我处理所有crud操作的视图集。
views.py
HerdViewSet
现在,当我浏览/api/herd/
端点species_type='Cow'
时,我得到了所有动物或空畜群的结果。但是某些群体中的动物没有过滤species_type
它仍会返回属于该群体的所有动物,无论它是Get-AzureAutomationSchedule -AutomationAccountName $automationAccountName
i get an error message:
Get-AzureAutomationSchedule : Nie można znaleźć żądanej wartości 'Week'. (The value 'Week' could not be found)
+ Get-AzureAutomationSchedule -AutomationAccountName $automationAccoun ...
+ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ CategoryInfo : CloseError: (:) [Get-AzureAutomationSchedule], ArgumentException
+ FullyQualifiedErrorId : Microsoft.Azure.Commands.Automation.Cmdlet.GetAzureAutomationSchedule
是山羊,绵羊等。
答案 0 :(得分:3)
您可以从Herd过滤species_type
。因为您在外键中定义了related_name
。
试试这个
from django.db.models import Count, Q
Herd.objects.annotate(animalCount=Count('animals')).filter(Q(animals__species_type='Cow')|Q(animalCount=0))
annotate
用于在结果中添加额外字段,因此新字段animalCount
用于保存该群体的动物数量。Q
用于构建复杂的查询条件,因此对于这种情况,Q(animals__species_type='Cow')|Q(animalCount=0)
表示,通过种群类型'牛群中的动物过滤,或者有那群牛没有动物。