【问题标题】:Django spanning relationshipsDjango 跨越关系
【发布时间】:2014-12-29 00:57:10
【问题描述】:

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

这是我的模型:

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

【问题讨论】:

    标签: django django-orm


    【解决方案1】:

    如果我正确地回答了您的问题,那么您的查询是错误的。 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 属性来获取用户对象。

    【讨论】:

      【解决方案2】:

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

      User.objects.filter(order__select__annual__year_id=2014)
      

      【讨论】:

      • 这更有意义,从用户开始。谢谢。我能够使用选择 PK:User.objects.filter(order__select='2') 使查询正常工作。我想更明确一点,就像你的查询一样。我返回以下错误:关系字段不支持嵌套查找。
      • 啊,没有看到您定义了相关名称。试试`order__select__annual_products__year_id
      • 我认为这是正确的方法... User.objects.filter(who_ordered__select__annual_products__id=1) 或 User.objects.filter(who_ordered__select__annual_products=annual_obj) 相关名称引用应该与每个引用匹配。我更新了我的答案。
      猜你喜欢
      • 1970-01-01
      • 2011-09-18
      • 2021-11-13
      • 2010-11-09
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-09-20
      • 1970-01-01
      相关资源
      最近更新 更多