2016-08-01 13 views
1

würde ich gerne ein Modell Manager für mein Kauf-Modell erstellen:Django Queryset - Filter-Objekte durch Boolesche Werte in einem verwandten Objekt

class Purchase(models.Model) 
    number = models.IntegerField 

class InventoryLog(models.Model) 
    purchase = models.ForeignKey(Purchase) 
    sold_out = models.BooleanField(default=false) 

Ich würde meine Modell-Manager wie alle Purchase Objekte zurückzugeben, die nicht verwandt sind zu einem InventoryLog Objekt mit einem sold_out Wert von True

gibt es eine Möglichkeit, dies mit einem queryset, Q-Objekt oder F Objekt zu behandeln, oder muß ich zu einem for-Schleife greifen?

Antwort

2

Ich glaube, Purchase.objects().exclude(inventorylog__sold_out=True) wird das tun.

+0

Funktioniert gut! Vielen Dank! –

0

Wenn Sie für Ihr Modell verwenden, verwalten, wie etwa diese:

#models.py 
class PurhchaseNotSoldOut(models.Manager): 
    def get_queryset(self): 
     return super(PurchaseNotSoldOut, self).get_queryset()\ 
          .exclude(purhcase_logs__sold_out=True) 

class Purchase(models.Model) 
    number = models.IntegerField 

    notSoldOut = PurchaseNotSoldOut() 

class InventoryLog(models.Model) 
    purchase = models.ForeignKey(Purchase, related_name='purchase_logs') 
    sold_out = models.BooleanField(default=false) 

Codebeispiel AKTUALISIERT dank Peter DeGlopper Kommentar.

+1

1) Falsche Syntax in Ihrer 'filter' -Klausel, verwenden Sie' __', um fk-Beziehungen in Filtern zu folgen. 2) diese beiden Abfragen sind nicht gleichwertig, da ein 'Purchase' viele' InventoryLog's haben kann. 'filter (purchase_log__sold_out = False)' findet diejenigen mit mindestens einer nicht ausverkauften, exclude() 'schließt diejenigen aus, die ausverkauft sind (also gibt es nur solche ohne ausverkauft). –

+0

Gibt es einen Vorteil, dass "get_queryset" überschrieben wird und nicht einfach eine neue zurückgegeben wird? –

+0

Überschreiben Sie 'get_queryset' ist, wie Sie normalerweise einen benutzerdefinierten Manager: https://docs.djangoproject.com/en/1.9/topics/db/managers/#modifying-a-manager-s-initial-queryset –