使用具有 M2M 关系的 django 查询时如何获取 1 个列表

问题描述 投票:0回答:1

这个问题非常相似(如果不一样):Django query — how to get list of dictionaries with M2M relation? .

我问这个问题只是为了了解自 11 年前以来 djagno 是否有任何改进,包括此功能


我有 M2M 关系:

class RandomObject(models.Model):
    name = models.CharField(max_length=50,blank=False) 
    description = models.TextField(blank=False)
    features = models.ManyToManyField('Features',blank=False,db_table='RandomObjectFeatures')

class Features(models.Model):

    LIGHTING = "LIT" 
    SECURE = "SGE"
    COVERED ="CVP" 
    
    FEATURE_NAME_CHOICES = [
                    (LIGHTING,"Lighting"),   
                    (SECURE,"Secured Well"),
                    (COVERED,"Covered"),
    ]
    
    feature_name = models.CharField(max_length=3,choices=FEATURE_NAME_CHOICES,blank=False,null=True)
    
    def __str__(self):
        for code, display_name in self.FEATURE_NAME_CHOICES:
            if self.feature_name == code:
                return display_name
        return self.feature_name

我已经填充了数据库,现在想要查询数据库以便能够在模板中显示随机对象的特征

random_objects_data = random_objects.values('name','features__feature_name') 

现在,当我打印此内容时,我得到以下内容:(我已将其截断,因为它很长,但它很重要)

{'name': 'object1', 'features__feature_name': 'SGE'}, {'name': 'object1', 'features__feature_name': 'LIT'},{'name': 'object1', 'features__feature_name': 'CVP'}

这没有帮助,因为创建的对象不在数据库中。我想要得到(或类似的东西):

 {'name': 'object1', 'features__feature_name': ['SGE','LIT','CVP']}

这意味着在模板中我可以迭代 features__feature_name 中的每个功能。

谢谢!

django django-models many-to-many django-queryset django-orm
1个回答
0
投票

最好为

RandomObject
模型创建一个自定义方法来迭代
features
属性。例如。

class RandomObject(models.Model):
name = models.CharField(max_length=50,blank=False)
description = models.TextField(blank=False)
features = models.ManyToManyField('Features')

def features_list(self):
    return {
        'name': self.name
        'features': [feature.feature_name for feature in self.features.all()]
    }

然后您可以迭代模板中的模型对象。

{% for feature in random_object.features_list.features %}
    {{feature}}
{% endfor %}
     

    
© www.soinside.com 2019 - 2024. All rights reserved.