提问人:Muffin 提问时间:10/25/2023 最后编辑:Muffin 更新时间:10/26/2023 访问量:51
使用具有 M2M 关系的 django 查询时如何获取 1 个列表
How to get 1 list when using django queries with a M2M relationship
问:
这个问题非常相似(如果不是相同的话):Django 查询 — 如何获取具有 M2M 关系的字典列表? .
我只是问这个问题,以便能够了解自 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
我已经填充了数据库,现在想查询数据库,以便能够在模板中显示 randomObject 的功能
random_objects = RandomObjects.objects.all()
random_objects_data = random_objects.values('name','features__feature_name')
现在,当我打印时,我得到以下内容:(我截断了它,因为它很长,但它很有意义)random_objects_data
{'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中的每个功能。
谢谢!
答:
0赞
Mess
10/26/2023
#1
如果从你的 views.py 你的上下文是这样的。
{'random_objects': RandomObject.objects.all()}
在模板中:
{% for random in random_objects %}
# render some things
{% for feature in random.features_list.features %}
{{feature}}
{% endfor %}
{% endfor %}
在您的模型中:
class RandomObject(models.Model):
name = models.CharField(max_length=50,blank=False)
description = models.TextField(blank=False)
features = models.ManyToManyField('Features')
@property
def features_list(self):
return {
'name': self.name
'features': [feature.feature_name for feature in self.features.all()]
}
评论
0赞
Mess
10/26/2023
请尝试此解决方案,并根据需要进行修改。不要忘记 features_list 方法的 @property 装饰器
评论