2014-11-02 2 views
6

설명서를 읽었지만 여전히 오류가 발생하고 있습니다. Catalog 객체에 대한 Orders를 배치 한 사용자가 있습니다. 특정 카탈로그 항목이 들어있는 Order가있는 모든 사용자를 반환하는 쿼리를 만들고 싶습니다. 여기 장고 관계에 걸쳐

class Catalog(models.Model): 
    name = models.CharField(max_length=100) 
    price = models.IntegerField() 

    def __unicode__(self): 
     return self.name 

class Annual(models.Model): 
    catalog = models.OneToOneField(Catalog, blank=True, null=True, related_name='annual_products') 
    year_id = models.IntegerField(max_length=4) 
    start_date = models.CharField(max_length=10) 
    end_date = models.CharField(max_length=10) 
    date = models.DateTimeField(auto_now_add=True, blank=True) 
    def __unicode__(self): 
     return unicode(self.year_id) 

class Order(models.Model): 
    user = models.ForeignKey(User, related_name='who_ordered') 
    select = models.ManyToManyField(Catalog, related_name='annuals_ordered', blank=True, null=True) 

    def __unicode__(self): 
     return unicode(self.user) 

내가 노력했습니다 쿼리입니다 : 내가 제대로 다음 질문을 받았다면

Catalog.objects.filter(order__select__annual='2014') 

답변

12

사용자가 필요한 경우 사용자부터 시작해야합니다. 또한 Annual, 즉 year_id의 특정 입력란을 필터링해야합니다.

User.objects.filter(order__select__annual__year_id=2014) 
+0

사용자부터 시작하면 훨씬 더 의미가 있습니다. 감사. 나는 PK : User.objects.filter (order__select = '2')를 사용하여 질의를 올바르게 수행 할 수 있었다. 나는 당신의 질문과 똑같이 더 명시 적으로하고 싶습니다. 그래도 다음 오류를 반환 해요 : 관계 필드 중첩 된 조회를 지원하지 않습니다. – byrdr

+0

아, related_name이 정의 된 것을 보지 못했습니다. 보십시오'order__select__annual_products__year_id –

+0

이것이 올바른 방법이라고 생각합니다 ... User.objects.filter (who_ordered__select__annual_products__id = 1) 또는 User.objects.filter (who_ordered__select__annual_products = annual_obj) 관련 참조 이름이 각 참조와 일치해야합니다. 나는 나의 대답을 업데이트했다. –

0

, 당신의 쿼리가 잘못 여기

내 모델입니다. Catalog 모델 내에 attribute 이름이 order 인 경우 필터링에 어떻게 사용할 수 있습니까? 아니면 내가 여기에 아무것도 없어?

직접 관련 분야에 관련된 이름 참조를 사용하여, 당신은 사용하여 사용자를 얻을 수 있습니다 -

# id is auto generated field or you can pass one annual_product object. 
User.objects.filter(who_ordered__select__annual_products__id=1) 

# OR 
annual = Annual.objects.all()[0] 
User.objects.filter(who_ordered__select__annual_products=annual) 

같은 달성 할 수있는 방법을 단계별로 단계 : -

# where 1 is the id of an one object in Catalog model. 
# You can pass Catalog object also to filter the users 
Order.objects.filter(select__id=1) 

# Here is the full query 
catalog = Catalog.objects.all()[0] 
orders = Order.objects.filter(select=catalog) 
users = [o.user for o in orders] # This loop isn't necessary. 

을 지금 Catalog에 해당하는 모든 주문이 있으므로이 순서대로 user 속성을 사용하여 사용자 개체를 가져올 수 있습니다.