如何根据子模型中的字段过滤模型?

时间:2014-03-18 19:08:03

标签: django django-models django-managers

我有以下模型结构。是否可以更改InventoryManager以检查由于切片后面包中的面包是否已不再存在?

from django.db import models
from shipping.models import Shipment


class InventoryManager(models.Manager):
    def get_queryset(self):
        # BUG: Does not check if BreadSlices are shipped
        return super(InventoryManager, self).get_queryset().filter(
            shipment__isnull=True, )


class BreadLoaf(models.Model):
    shipment = models.ForeignKey(Shipment, null=True, blank=True, )
    ...

    objects = models.Manager()
    inventory = InventoryManager()

    def get_shipment(self):
        if self.breadslice_set.all().exists():
            #  BUG: Returns duplicates
            return [bs.shipment for bs in self.breadslice_set.all()]
        else:
            return [self.shipment]


class BreadSlice(models.Model):
    loaf = models.ForeignKey(BreadLoaf)
    shipment = models.ForeignKey(Shipment, null=True, blank=True, )
    ...

我希望使用get_shipment方法,但它不是一个字段。我试了以下没有成功

class InventoryManager(models.Manager):
    def get_queryset(self):
        return super(InventoryManager, self).get_queryset().filter(
            shipment__isnull=True,
            breadslice_set.shipment_isnull=True, )

感谢阅读!

1 个答案:

答案 0 :(得分:0)

解决方案:

class InventoryManager(models.Manager):
    def get_queryset(self):
        return super(InventoryManager, self).get_queryset().filter(
            shipment__isnull=True,
            breadslice__shipment__isnull=True, )

作品。

BreadLoaf.inventory.all() # Returns all loaf of bread still in inventory.

https://docs.djangoproject.com/en/1.6/topics/db/queries/#lookups-that-span-relationships