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属性可以获得用户对象。

最新更新