【问题标题】:Filter Child rows in a Django Queryset在 Django 查询集中过滤子行
【发布时间】:2013-03-16 11:45:09
【问题描述】:

在查询集中,我想返回一个集合(按 pk)和所有具有 status='ACTIVE' 的 Sales 对象。

我试过了:

Collection.objects.filter(Sales__status="ACTIVE")

但是,如果其中一个 Sales 对象与条件匹配,而不仅仅是状态为“ACTIVE”的对象,我将返回包含所有 Sales 对象的集合对象

所以我有 2 个模型(和一个参考模型)

class Collection(models.Model):
    ID = models.AutoField(primary_key=True)
    collection_title = models.CharField(max_length=255)

class Sales(models.Model):
    ID = models.AutoField(primary_key=True)
    sales_title = models.CharField(max_length=255)

class CollectionSales(models.Model):
    COLLECTIONSALES_STATUS_LIST = (
        ('ACTIVE', 'Active'),
        ('REJECT', 'Reject'),
    )
    collection = models.ForeignKey('Collection')
    sales = models.ForeignKey('Sales')
    status = models.CharField(max_length=10, choices=COLLECTIONSALES_STATUS_LIST, default="ACTIVE")
    class Meta:
        db_table = "myschema_collection_sales"
        managed=False  

编辑: 我正在尝试将其放入 Rest-Framework 中,以便输出为:

{
"count": 2, 
"next": null, 
"previous": null, 
"results": [
    {
        "ID": "1", 
        "collection_title": "My Collection 1", 
        "Sales": [
              {
                 "ID": 12,
                 "sales_title": "my sales title 12",
                 "status": "ACTIVE"
              }
         ]
    }
    ,
    {
        "ID": "2", 
        "collection_title": "My Collection 2", 
        "Sales": [
              {
                 "ID": 4,
                 "sales_title": "my sales title 4",
                 "status": "ACTIVE"
              },
              {
                 "ID": 5,
                 "sales_title": "my sales title 5",
                 "status": "ACTIVE"
              }
         ]
    }
]
}

【问题讨论】:

  • 我认为您的查询是 Collection.objects.filter(sales__status="ACTIVE")?它自然会返回所有销售活跃的系列。
  • 你到底想要什么?有活跃销售的系列? CollectionSales 进行活跃销售?
  • 我希望查询返回集合对象以及“ACTIVE”的所有销售

标签: django django-models django-queryset django-rest-framework


【解决方案1】:

您必须自己构建数据结构。您想要的基本上是两个查询,而您无法一次调用。

data = {"collection":None, "sales":[]}
for coll in Collection.objects.filter(sales__status="ACTIVE"):
   data["collection"] = coll
   for collsales in coll.collectionsales_set.filter(status="ACTIVE")
      data["sales"].append(collsales.collection)

【讨论】:

  • 好的,感谢您的回答 RickyA。我会看看并相应更新。
  • 问题是我正在尝试将它与休息框架一起使用。我发现了这个问题,但不知道如何适应我的情况(如果可以适应的话):link
  • 是的,这很痛苦。我对美味派也有类似的问题。诀窍是不要使用与模型绑定的处理程序,而是使用允许您编写自定义代码的更通用的处理程序。也许this 适合你?
  • 感谢 RickyA,我花了无数时间阅读文档,但无济于事。我在想我可能必须重组我的模型以适应框架(这远非理想)。
  • 是的,那是我退出使用这些 rest-frameworks 并用普通的旧 django 视图解决它的时候。它们与 ORM 非常接近……
猜你喜欢
  • 2019-12-04
  • 1970-01-01
  • 2020-08-22
  • 2019-04-15
  • 2011-09-29
  • 2011-02-04
相关资源
最近更新 更多