Skip to main content
 首页 » 编程设计

python之django View 限制子查询

2024年08月28日2898°冷暖

我有 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))