0

クエリセットで、コレクション(pkによる)とstatus='ACTIVE'を持つすべてのSalesオブジェクトを返します。

私が試してみました:

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

ただし、ステータスが「ACTIVE」のオブジェクトだけでなく、Salesオブジェクトの1つが条件に一致する場合は、すべての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"
              }
         ]
    }
]
}
4

1 に答える 1

1

データ構造を自分で構築する必要があります。必要なのは本質的に2つのクエリであり、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)
于 2013-03-26T16:10:03.573 に答える