我在Django应用程序中有一个模型,被其他多个模型作为ForeignKey引用。
我正在寻找的方法是为这个类的所有对象创建一个单个查询集,其他类根据某些标准被外键引用。
我甚至不确定这是否可行,但无论如何我都想过要问。
class Person(models.Model):
pass
class Book(models.Model):
year_published = models.PositiveIntegerField()
author = models.ForeignKey(Person)
class MusicAlbum(models.Model):
year_published = models.PositiveIntegerField()
producer = models.ForeignKey(Person)
recent_books = Book.objects.filter(year_published__gte=2018)
recent_music_albums = MusicAlbum.objects.filter(year_published__gte=2018)
# How can I create a **single** queryset of the Person objects that are being referenced as `author` in `recent_books` and as `producer` in `recent_music_albums`?
感谢您的时间。
答案 0 :(得分:2)
目前我没有Django在我面前,但是如下所示:
class Person(models.Model):
pass
class Book(models.Model):
year_published = models.PositiveIntegerField()
author = models.ForeignKey(Person, related_name='books')
class MusicAlbum(models.Model):
year_published = models.PositiveIntegerField()
producer = models.ForeignKey(Person, related_name='albums')
Person.objects.filter(books__year_published__gte=2018, albums__year_published__gte=2018)
或者,如果你不得不做前两个查询,
Person.objects.filter(books__in=recent_books, albums__in=recent_music_albums)
答案 1 :(得分:1)
对于Person
和Book
,MusicAlbum
个模型实例将book_set
RelatedManager
。可能他们仍然会有默认名称musicalbum_set
和persons_books = person.book_set.all()
persons_musicalbums = person.musicalbum_set.all()
,因为您没有覆盖它们。
您可以使用这些来查找与一个人实例相关联的图书/音乐专辑:
qs = Person.objects.exclude(book=None).exclude(musicalbum=None)
同样,您可以从模型管理器生成相关的查询集:
x = 0
x = "zero"
答案 2 :(得分:0)
同样可以实现:
person = Person.objects.latest('book__year_published', 'musicalbum__year_published')
personList = Person.objects.all().order_by('-book__year_published', '-musicalbum__year_published')