Можете ли вы объяснить разницу между атрибутами related_name
и related_query_name
для объекта Field в Django? Когда я их использую, как их использовать? Спасибо!
Разница между атрибутами "related_name" и "related_query_name" в 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 для использования в качестве обратного имени фильтра из целевой модели
Ответ 3
См. Пример сотрудника компании для этих двух полей в этом посте https://simpleisbetterthancomplex.com/tips/2018/02/10/django-tip-22-designing-better-models.html
Я нахожу это наиболее кратким и легко усваиваемым