簡體   English   中英

Django:聚合多對多值的查詢集

[英]Django: Queryset aggregating ManyToMany values

我有 MyUser 模型與 ForeignKey 和 ManyToMany 相關領域城市技能

帳戶/模型.py

class MyUser(AbstractBaseUser):
    email = models.EmailField()
    city = models.ForeignKey('jobs.City')
    skills = models.ManyToManyField('jobs.Skill')

工作/模型.py

class Skill(models.Model):
    name = models.CharField()
class City(models.Model):
    name = models.CharField()

我需要制作一個以這種格式返回數據的查詢集:

{'email': 'some@email.com', 'city': 'London', 'skills': ['Python', 'Java']},
{'email': 'another@email.com', 'city': 'Berlin', 'skills': ['JavaScript', 'C#', 'Python']},
...

MyUser.objects.values('email', 'city__name', 'skills__name')返回我需要的所有數據,但 ManytoMany 值分別返回復制其他條目:

{'email': 'some@email.com', 'city': 'London', 'skills': 'Python'},
{'email': 'some@email.com', 'city': 'London', 'skills': 'Java'},
{'email': 'another@email.com', 'city': 'Berlin', 'skills': 'JavaScript'},
{'email': 'another@email.com', 'city': 'Berlin', 'skills': 'C#'},
{'email': 'another@email.com', 'city': 'Berlin', 'skills': 'Python'},
...

那么如何制作一個將 ManyToMany 值聚合為一組的查詢集?

https://docs.djangoproject.com/en/3.1/ref/models/querysets/#values

Django 文檔對這種情況發出警告

警告:因為 ManyToManyField 屬性和反向關系可以有多個相關行,包括這些可以對結果集的大小產生乘數效應。 如果您在 values() 查詢中包含多個這樣的字段,這將特別明顯,在這種情況下,將返回所有可能的組合。

我已經搜索了替代方法,例如使用序列化程序,但我認為唯一的方法是循環遍歷查詢集並使用所需數據創建自己的字典列表。

我建議為您的模型添加自定義屬性

class MyUser(models.Model):
    email = models.EmailField()
    city = models.ForeignKey(City, on_delete=models.PROTECT)
    skills = models.ManyToManyField(Skill)

    @property
    def get_skills(self):
        skills = self.skills.all()
        skills_list = []
        for skill in skills:
            skills_list.append(skill.name)

        return skills_list

現在更容易獲得技能屬性的名稱列表

users_list = []
for my_user in MyUser.objects.all():
    users_list.append({
        'email': my_user.email,
        'city': my_user.city.name,
        'skills': my_user.get_skills,
    })

也許這不是您正在尋找的解決方案,也可能不是最好的方法,無論如何我希望這個答案對您有所幫助。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM