用DRF反向过滤Django模型

时间:2016-11-22 09:37:15

标签: python django django-models django-rest-framework

我在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 是山羊,绵羊等。

1 个答案:

答案 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))
  1. annotate用于在结果中添加额外字段,因此新字段animalCount用于保存该群体的动物数量。
  2. Q用于构建复杂的查询条件,因此对于这种情况,Q(animals__species_type='Cow')|Q(animalCount=0)表示,通过种群类型'牛群中的动物过滤,或者有那群牛没有动物。