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)
答
如果我得到你的问题正确的话,您的查询是错误的。您的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
属性来获取用户对象。
这样做更有意义,从用户开始。谢谢。我能够通过select PK:User.objects.filter(order__select ='2')正确地查询查询。我想更加明确,完全像你的问题。但是,我返回了以下错误:关系字段不支持嵌套查找。 – byrdr 2014-11-02 13:53:07
啊,没有看到你有一个related_name定义。尝试'order__select__annual_products__year_id – 2014-11-02 15:05:59
我认为这是正确的方式... 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