通过Django Rest Framework中的查找表进行迭代

时间:2018-07-15 04:57:47

标签: python django django-rest-framework

我有一个查找表,其中包含课程类别和子类别,分别为:

{
        "id": 138,
        "lookup": "CRS_CTGRY",
        "attr1": "Arts and Humanities",
        "attr2": "الفنون والعلوم الإنسانية",
        "attr3": null,
        "attr4": null,
        "attr5": null,
        "editable": 1
    },

{
        "id": 155,
        "lookup": "CRS_SB_CTGRY",
        "attr1": "Photography",
        "attr2": "النصوير",
        "attr3": "138",
        "attr4": null,
        "attr5": null,
        "editable": 1
    },

它们之间的关系是attr3 = id_of_the_category && attr1 = CRS_SB_CTGRY

我想将它们合并到一个列表中,例如:

{"id":138,"
"lookup":"CRS_CTRGY",
"name":"Arts and Humanities",
"subcategories":{"id": 154,
                 "lookup": "CRS_SB_CTGRY",
                  "attr1": "Music",
                  "attr2": "الموسيقي",
                  "attr3": "138",
                  "attr4": null,
                   "attr5": null,
                    "editable": 1
}}

这是我的模型。py:

class Lookups(models.Model):
lookup = models.CharField(max_length=45)
attr1 = models.CharField(max_length=100)
attr2 = models.CharField(max_length=100, blank=True, null=True)
attr3 = models.CharField(max_length=100, blank=True, null=True)
attr4 = models.CharField(max_length=100, blank=True, null=True)
attr5 = models.CharField(max_length=100, blank=True, null=True)
editable = models.IntegerField(blank=True, null=True)

class Meta:
    managed = True
    db_table = 'lookups'
    unique_together = (('lookup', 'attr1', 'attr2', 'attr3', 'attr4', 'attr5'),)

我该怎么办?在哪里放置代码?在序列化程序类中?

1 个答案:

答案 0 :(得分:0)

我真的不知道您要做什么,因为您的示例(文本)与示例(代码屏幕截图)不匹配。

从您的代码屏幕截图中可以看出,如果lookupCRS_CTGRY,这是主要类别;如果lookupCRS_SUB_CTGRY,则这是子类别,并将父类别ID存储在attr3中。

现在,您希望获得此结构的字典对象。假设模型中包含所有数据:

combined = []
lookup_indices = {} # stores parents lookup for easier access.

for obj in Lookups.objects.filter(lookup='CRS_CTGY').values():
   obj['subcategories'] = []
   combined.append(obj)
   lookup_indicies[obj.pk] = len(combined) - 1

for obj in Lookups.objects.filter(lookup='CRS_SUB_CTGRY').values():
   try:
      combined[lookup_indicies[int(obj['attr3'])]]['subcategories'].append(obj)
   except KeyError:
      print('No parent id {} found for sub cat {}'.format(obj['attr3'], obj))

print(combined)