Django跨越关系

问题描述:

我已阅读文档,但仍然出现错误。我有用户为目录对象放置订单。我想创建一个查询,它返回所有具有包含特定目录项的订单的用户。Django跨越关系

这里是我的模型:

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') 

如果你需要用户,你应该从用户开始。另外,您需要过滤Annual中的特定字段,即year_id。

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

这样做更有意义,从用户开始。谢谢。我能够通过select PK:User.objects.filter(order__select ='2')正确地查询查询。我想更加明确,完全像你的问题。但是,我返回了以下错误:关系字段不支持嵌套查找。 – byrdr 2014-11-02 13:53:07

+0

啊,没有看到你有一个related_name定义。尝试'order__select__annual_products__year_id – 2014-11-02 15:05:59

+0

我认为这是正确的方式... User.objects.filter(who_ordered__select__annual_products__id = 1)或User.objects.filter(who_ordered__select__annual_products = annual_obj)相关的名称引用应该匹配每个引用。我更新了我的答案。 – 2014-11-02 15:15:38

如果我得到你的问题正确的话,您的查询是错误的。您的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属性来获取用户对象。