Обратные ссылки в поиске запросов, охватывающих отношения
В официальной документации Django есть пример, приведенный ниже,
from django.db import models
class Blog(models.Model):
name = models.CharField(max_length=100)
tagline = models.TextField()
def __str__(self):
return self.name
class Author(models.Model):
name = models.CharField(max_length=200)
email = models.EmailField()
def __str__(self):
return self.name
class Entry(models.Model):
blog = models.ForeignKey(Blog, on_delete=models.CASCADE)
headline = models.CharField(max_length=255)
body_text = models.TextField()
pub_date = models.DateField()
mod_date = models.DateField()
authors = models.ManyToManyField(Author)
number_of_comments = models.IntegerField()
number_of_pingbacks = models.IntegerField()
rating = models.IntegerField()
def __str__(self):
return self.headline
В приведенном ниже поиске,
>>> Blog.objects.filter(entry__headline__contains='Lennon')
Q: Даже если один внешний ключ, определенный в классе Entry
, указывает на Blog
, но в классе нет поля entry
, определенного в классе Blog
, как может вышеприведенный поиск ссылаться на класс Entry
из Blog
в форме entry__headline
?
Я не видел нигде в официальных документах разрешения на такое использование...
В модели Entry
есть FK к blog
и вы можете использовать имя модели, entry
для поиска
При использовании entry__headline__contains='Lennon'
django понимает, что вы хотите искать в связанной модели с именем entry
, и затем может выполнить поиск за вас
Но для доступа к entry
модели через blog
запрос, вы должны использовать его related_name
. вы можете найти об этом в https://docs.djangoproject.com/en/3.2/topics/db/queries/#backwards-related-objects