Разница между атрибутами "related_name" и "related_query_name" в Django?

Можете ли вы объяснить разницу между атрибутами related_name и related_query_name для объекта Field в Django? Когда я их использую, как их использовать? Спасибо!

Ответ 1

related_name будет атрибутом связанного объекта, который позволит вам "вернуться" к модели с внешним ключом на ней. Например, если ModelA имеет поле, подобное: model_b = ForeignKeyField(ModelB, related_name='model_as'), это позволит вам получить доступ к экземплярам ModelA, которые связаны с вашим экземпляром ModelB, нажав model_b_instance.model_as.all(). Обратите внимание, что это обычно пишется с множественным числом для внешнего ключа, потому что внешний ключ является отношением один ко многим, и многим аспектом этого уравнения является модель с объявленным в нем полем внешнего ключа.

Дальнейшее объяснение, связанное с в документах, полезно. https://docs.djangoproject.com/en/dev/topics/db/queries/#backwards-related-objects

related_query_name предназначен для использования в наборах запросов Django. Это позволяет фильтровать обратную связь по полю, связанному с внешним ключом. Для продолжения нашего примера - наличие поля в Model A, например: model_b = ForeignKeyField(ModelB, related_query_name='model_a') позволит вам использовать model_a в качестве параметра поиска в наборе запросов, например: ModelB.objects.filter(model_a=whatever). Более распространенным является использование формы единственного числа для related_query_name. Как говорится в документации, нет необходимости указывать оба (или один из) related_name и related_query_name. Джанго имеет разумные значения по умолчанию.

Ответ 2

class Musician(models.Model):
first_name = models.CharField(max_length=50)
last_name = models.CharField(max_length=50)

class Album(models.Model):
    artist = models.ForeignKey(Musician, on_delete=models.CASCADE)
    name = models.CharField(max_length=100)

Здесь отношение внешнего ключа к альбому - к музыканту, а обратное отношение - к альбому. означает, что один экземпляр альбома может иметь отношение только к одному экземпляру музыканта (прямое отношение), а один экземпляр музыканта может относиться к нескольким экземплярам альбома (назад). прямой запрос будет подобен этому Album_instance.artist, обратите внимание, что прямой запрос выполняется Album_instanc, за которым следует исполнитель (имя поля). и назад будет

Musician_instance.album_set.all() 

здесь для обратного запроса используется modelname_set.

Теперь, если вы указываете related_name, например artist = models.ForeignKey(Musician, on_delete=models.CASCADE, related_name='back')

тогда синтаксис обратного запроса будет изменен modelname_set (artist.set) будет заменен на back. теперь обратный запрос

Musician_instance.back.all()

Если вы предпочитаете, чтобы Django не создавал обратную связь, установите для related_name значение "+" или завершите его с помощью "+".

и related_query_name для использования в качестве обратного имени фильтра из целевой модели