2016-08-31 1 views
0

나는 세 가지 모델이 있습니다장고 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') 

하지만 먼저, 그것은 나에게 "중첩 된 조회가 지원되지 않습니다"내가 달 필터를 taked, 그러나 그 후 나에게 FieldError을 제공합니다 제공합니다 Cannot resolve keyword 'sale' into field

내가 어떻게 할 수 있습니까?

+0

'저장소'모델은 어디에 있습니까? 또한이 특별한 명명 규칙을 따르는 이유는 무엇입니까? – 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') 

는 또한, 당신의 이름 지정 규칙은 내가 헨리 H가 정리 솔루션을 제공 믿고, 정말 나쁜, 나뿐만 아니라 그것을 추천 할 것입니다. 그걸 정리하면 커스텀 매니저 방식으로 정말 멋지게 만들 수 있습니다.

+0

나는 그것을 생각하지 않았다. 나는 그것을 판매에서 시도 할 것이다. – 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를 사용했습니다. 장고의 ID가 아닌 ID를 사용해야합니다. 그리고 솔루션에 대해 고마워요, 나는 그것을 시도 할 것입니다. – elG

+0

기본적으로 테이블의 이름은 모델에서 완전히 생략 할 수있는 기본 키의 이름에 "_id"를 자동으로 추가합니다. – electrometro