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

How to get 1 list when using django queries with a M2M relationship

提问人:Muffin 提问时间:10/25/2023 最后编辑:Muffin 更新时间:10/26/2023 访问量:51

问:

这个问题非常相似(如果不是相同的话):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中的每个功能。

谢谢!

django 对多 django-orm

评论


答:

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 装饰器