Django 1.8深度反向关系查找

时间:2016-08-31 01:59:23

标签: django

我有三种模式:

class Product(models.Model):
    idproduct=models.AutoField(primary_key=True)
    productname=models.CharField(max_length=100, blank=False, null=False)
    product_state=models.BooleanField(default=True)


class ProductInventory(models.Model):
    idinventory=models.AutoField(primary_key=True)
    product_idproduct=models.ForeignKey(Product)
    storage_idstorage=models.ForeignKey(Storage)

class Sale(models.Model):
    idsale=models.AutoField(primary_key=True)
    sale_date = models.DateTimeField(default=timezone.now)
    inventory_idinventory=models.ForeignKey(ProductInventory)

我想要的是获得本月销售的所有产品,我试过这个:

thisdate=datetime.today()
products=Product.objects.filter(product_state=1,productinventory__sale__sale_date__month=thisdate.month).values('pk','productname','productinventory__sale__sale_date')

但首先,它给了我"不支持嵌套查找"所以我删除了月份过滤器,但之后它给了我一个FieldError:Cannot resolve keyword 'sale' into field

我该怎么做?

2 个答案:

答案 0 :(得分:2)

为什么要查询产品?为什么不从Sale查询?

Sale.objects.filter(sale_date__month=thisdate).filter(inventory_idinventory__product_idproduct__productstate=True).values('inventory_idinventory __product_idproduct__pk', 'inventory_idinventory __product_idproduct__ productname')

另外,你的命名惯例非常糟糕,我相信Henry H提供了一个清理解决方案,我也会推荐它。如果你清理了它,你可以使用自定义管理器方法使这看起来非常好看。

答案 1 :(得分:1)

class Product(models.Model):
    name=models.CharField(max_length=100, blank=False, null=False)
    state=models.BooleanField(default=True)

class Product_Inventory(models.Model):
    product=models.ForeignKey(Product)
    storage=models.ForeignKey(Storage)

class Sale(models.Model):
    date = models.DateTimeField(default=timezone.now)
    product_inventory=models.ForeignKey(Product_Inventory)
thisdate=datetime.today()
inventory=[]
products=[]

sales = Sale.objects.filter(date__month = thisdate.month)
for item in sales:
    inventory.append(Product_inventory.objects.filter(sale = item))
for product in inventory:
    products.append(Product.objects.filter(product_inventory = product))

print products

这样的事情会起作用。我很自由地清理你的模型,因为它很难阅读。 ID会自动添加到您的模型中(如pk),因此您无需在此处添加ID。