gpt4 book ai didi

Django:具有不同模型函数的 SQL 查询

转载 作者:行者123 更新时间:2023-12-04 07:00:52 24 4
gpt4 key购买 nike

嗨 Stackoverflow 的人,

在我当前的项目中,我有以下模型结构:

class Project(models.Model):
student_id = models.ForeignKey(User)
class_a = models.ForeignKey(ClassA)
class_b = models.ForeignKey(ClassB)
...

class ClassA(models.Model):
teacher_name = models.CharField(...)

class ClassB(models.Model):
teacher_name = models.CharField(...)

ClassA 和 ClassB 非常不同,只有它们只有有共同的 teacher_name,因此我将它放在不同的类中。此外,在每个项目中,只有class_a class_b 可以包含一个ForeignKey(不能分配给两个类)。

当我显示所有项目时,我想列出老师的名字,因此我创建了一个小模型函数,它返回老师的名字:

def get_teacher_name(self):
if self.class_a:
return self.class_a.teacher_name
if self.class_b:
return self.class_b.teacher_name

现在,我想编写一个查询,它返回一个 student_id 的教师姓名,并且只返回一次教师姓名,例如:对于学生 X项目老师生物学 X 老师物理Y先生(-> 数学 Y 先生应该被忽略)

我应该如何构造 Django 查询?我想要做Project.objects.filter(student_id=user.pk).values('get_teacher_name').distinct(),但这是不可能的。有解决方案吗?

感谢您的建议!

最佳答案

您正在寻找 valuesannotate https://docs.djangoproject.com/en/dev/topics/db/aggregation/#order-of-annotate-and-values-clauses

这将为您提供值(value)调用的唯一值(value)。

import itertools

class_a_names = user.project_set.values_list('class_a__teacher_name', flat=True).annotate()
class_b_names = user.project_set.values_list('class_b__teacher_name', flat=True).annotate()
unique_teachers = set(itertools.chain(class_a_names, class_b_names))

关于Django:具有不同模型函数的 SQL 查询,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8675267/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com