我有 3 个模型: 模型.py:
class Person(models.Model):
first_name = models.CharField(max_length=30)
last_name = models.CharField(max_length=30)
class Musician(models.Model):
person = models.ForeignKey(Person)
instrument = models.CharField(max_length=100)
class Album(models.Model):
artist = models.ForeignKey(Musician)
name = models.CharField(max_length=100)
release_date = models.DateField()
num_stars = models.IntegerField()
我正在尝试构建一个 View : 显示所有人及其专辑,不包括评级为 1 星的专辑。 View .py:
inner_qs = Musician.objects.filter(Album__num_stars__exact=1).values_list('person', flat=True).distinct()
person_list = Person.objects.exclude(Musician__Album__id__in=inner_qs).distinct()
查询 aways 排除了所有可能拥有 1 星专辑的艺术家。 我需要在 SQL 上看起来像这样的东西:
SELECT p.first_name, p.last_name,m.instrument, m.name, m.num_stars
FROM Person p
INNER JOIN Musician m ON m.person = p.id
INNER JOIN Album a ON a.artist = m.id
WHERE m.num_stars <> 1
我知道 View 在 Person 级别排除,但我如何将元素进一步排除到数据库模型中?
谢谢!
请您参考如下方法:
如果您需要来自链接对象的所有字段数据(结果 sql 将与您需要的类似):
Album.objects.filter(~Q(num_stars=1)).select_related()
并且只有个人数据:
Person.objects.filter(~Q(musician__album__num_stars=1))
