2016-11-22 6 views
1

Ich habe Probleme bei der Filterung in django-models und ich verwende django-rest-framework, um diese serialisierten Daten zu arbeiten.Reverse Filter Django Modell mit DRF

Was ich will hier ist, um alle Herden aufnehmen beide mit Tier (en), in denen das Tier eine species_type='Cow' oder eine leere Herde (s) haben konnte.

Das sind meine Modelle.

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

Das ist mein Viewset die alle CRUD-Operationen handhaben. Jetzt

views.py

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

wenn ich durchsuchen Sie die HerdViewSet Endpunkt /api/herd/ Ich habe die Ergebnisse aller Herden mit Tieren oder leer Herde (n). Aber die Tiere in irgendeiner Herde filtern nicht das species_type='Cow' es noch alle Tier zurückkehrt, die zu diesen Herd gehört, ob es species_type ist Ziege, Schaf, etc ..

+1

wo hast du den Filter 'spezies_type = 'Cow'' gemacht? – Enix

+0

@Enix hi, es sollte hier in dieser Zeile sein 'querieset = Herd.objects.all()' im Viewset aber leider habe ich noch keine Idee, wie das geht, da es in meinem 'Herd' Modell keine Feldtiere gibt anders als in meinem 'HerdSerializer'. –

+0

@ ShiftN'Tab Wenn Sie alle Herden-Daten mit Tierfilterung nach Spezies_Typ = 'Kuh' benötigen, dann müssen Sie Ihre Modellstruktur und die Beziehungen zwischen den Feldern aktualisieren. –

Antwort

3

Sie von species_type von Herd filtern. Weil Sie im Fremdschlüssel einen related_name definiert haben.

versuchen diese

from django.db.models import Count, Q 

Herd.objects.annotate(animalCount=Count('animals')).filter(Q(animals__species_type='Cow')|Q(animalCount=0)) 
  1. annotate verwendet wird, ein zusätzliches Feld zu den Ergebnissen hinzuzufügen, so dass ein neues Feld animalCount verwendet wird, für die Herde, wie viele Tiere zu halten.
  2. Q wird verwendet, um komplizierte Abfrage Bedingung zu bauen, so für diesen Fall, Q(animals__species_type='Cow')|Q(animalCount=0) bedeutet, Filter von den Tieren in der Herde mit Arten Typ "Kuh", oder es gibt keine Tiere in dieser Herde.
+1

@PrakharTrivedi nicht "Tier" sondern "Tiere". es existiert ... weil er einen 'related_name' im' Fremdschlüsselfeld' definiert hat. Ich habe diesen Code in meiner Maschine getestet ... – Enix

+0

@PrakharTrivedi ich denke nicht, es löst mein Problem! –

+0

@Enix Du hattest eine tolle Idee, aber irgendetwas stimmt nicht, ich kann keine leere Herde zeigen. –

Verwandte Themen