2016-08-31 50 views
0

我有三個型號:的Django 1.8深的反向關係查找

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

我怎樣才能做到這一點?

+0

你的'Storage'模型在哪裏?另外,你遵循這個特定命名約定的原因是什麼? – electrometro

回答

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提供了一個清理解決方案,我也會推薦它。如果你清理了它,你可以使用自定義管理器方法使它看起來非常好。

+0

我沒有想到,我會從Sale中嘗試它。 – elG

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),因此您不一定必須在此處添加它們。

+0

我使用過id,因爲它與MySql數據庫有關,我必須使用該ID,而不是Django。謝謝你的解決方案,我會嘗試一下。 – elG

+0

默認情況下,表中的名稱會自動將「_id」附加到主鍵的名稱上,這些名稱可以從模型中完全省略。 – electrometro