django 根据多对多字段连接并获取查询集

s5a0g9ez  于 2023-02-10  发布在  Go
关注(0)|答案(2)|浏览(98)

我有MyUser模型与外键和ManyToMany相关字段城市和技能:

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

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

假设这是数据库中表数据:
x一个一个一个一个x一个一个二个x
输出为2,但我希望:

MyUser.objects. ..........

回答5我喜欢以下数据:

{'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'},
r6hnlfcb

r6hnlfcb1#

您可以像这样简单地查询:

MyUser.objects.values('email', 'city', 'skills__name')

您还可以将skills__name字段重命名为:

MyUser.objects.annotate(skill=F('skills__name')).values('email', 'city', 'skill')
68de4m5k

68de4m5k2#

您可以使用annoate()、Count聚合和values()来获得所需的输出,因此:

from django.db.models import Count

all_users = MyUser.objects.annotate(num_skills=Count('skills')).values('email', 'num_skills')

data = []
for single_user in all_users:
    email = single_user['email']
    num_skills = single_user['num_skills']
    skills = MyUser.objects.get(email=email).skills.all()
    for skill in skills:
        data.append({'email': email, 'city': 'London', 'skills': skill.name})

print(data)

显然,这不是一个好的解决方案,因为city值对于第一和第二用户分别被硬编码为LondonBerlin

相关问题