2016-11-22 34 views
1

私はdjango-modelsでフィルタリングしている問題を抱えています。このシリアル化されたデータを処理するにはdjango-rest-frameworkを使用しています。DRFを使用した逆フィルタDjangoモデル

私がここで欲しいのは、動物が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操作を扱う私のビューセットです。私はHerdViewSetエンドポイント/api/herd/を参照するとき

views.py

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

は、今私は動物や空の群れ(複数可)を持つすべての群れの結果を得ました。しかし、いくつかの群れの動物が、それはまだそれがspecies_typeはヤギ、ヒツジ、等であるかどうかをその群れに属するすべての動物を返すspecies_type='Cow'をフィルタリングしていません。..

+1

ここで、 'species_type = 'Cow''というフィルタを作成しましたか? – Enix

+0

@Enixこんにちは、これはビューセットの 'queryset = Herd.objects.all()'にあるはずですが、悲しいことに私の 'Herd'モデルにフィールド動物がないのでこれをどうやってやっているのかまだ分かりません私の 'HerdSerializer'とは異なります。 –

+0

@ ShiftN'Tab animals_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)は、種別 'Cow'の群れの動物によってフィルタリングするか、その群れに動物が存在しないことを意味します。
+1

@PrakharTrivediは動物ではなく動物である。それは存在します...彼は 'foreign keyフィールド'に 'related_name'を定義しました。私は私のマシンでこのコードをテストしました... – Enix

+0

@PrakharTrivedi私はそれが私の問題を解決するとは思わない! –

+0

@Enixあなたは素晴らしい考えがありましたが、何かが間違っています。私は空の群れを表示できません。 –

関連する問題