Обратные ссылки в поиске запросов, охватывающих отношения

В официальной документации 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

Вернуться на верх