2016-11-22 76 views
1

我有問題篩選django-models和我使用django-rest-framework工作這個序列化的數據。反向過濾Django模型與DRF

我想在這裏得到的所有羣都記錄動物可能有一個species_type='Cow'或一個空的羣的動物。

這是我的模特。

models.py

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) 

serializers.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'] 

這是我的視圖集中其處理所有CRUD操作。

views.py

class HerdViewset(viewsets.ModelViewSet): 
    """ 
    This viewset automatically provides `list`, `create`, `retrieve`, 
    `update` and `destroy` actions. 
    """ 
    queryset = Herd.objects.all() 
    serializer_class = HerdSerializer 

現在,當我瀏覽HerdViewSet端點/api/herd/我得到了與動物或空牛羣(S)的所有牛羣的結果。但在一些放養的動物不過濾species_type='Cow'仍然會返回屬於那個牛羣是否species_type是山羊,綿羊,等所有的動物..

+1

你在哪兒做了過濾器'species_type ='Cow''? – Enix

+0

@Enix嗨,它應該在這一行'queryset = Herd.objects.all()'在視圖中,但遺憾的是我仍然沒有任何想法如何做到這一點,因爲我的'Herd'模型中沒有野外動物不像在我的'HerdSerializer'中。 –

+0

@ ShiftN'Tab如果您需要根據species_type ='Cow'動物過濾所有的牧羣數據,那麼您需要更新模型結構和字段之間的關係。 –

回答

3

您可以通過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)表示由羣體中的物種類型爲「牛」的動物過濾,或者該羣體中沒有動物。
+1

@PrakharTrivedi不是'動物'而是'動物'。它確實存在......因爲他在「外鍵字段」中定義了一個'related_name'。我在我的機器上測試了這個代碼... – Enix

+0

@PrakharTrivedi我認爲不是它解決了我的問題! –

+0

@Enix你有一個好主意,但有些地方錯了,我不能顯示一個空的羣。 –