Related name django для чего

Обновлено: 25.06.2024

Я пытаюсь отфильтровать поле related_name с помощью запроса, если это возможно. Я сериализирую таблицы.

Выше в списке полей. tasks - related_table , поэтому в таблице задач у меня есть поле task_created_at и когда я получаю таблицу проектов. Я хочу отфильтровать его по этому полю.

Конечно это: task_created_at__startswith="2020-04" не работает. Потому что task_created_at нет в проектах. это в related_name , который tasks . Так есть ли способ фильтрации задач с получением проектов

И соответствующие модели:

Для чего используется `related_name` в Django?

Какой аргумент related_name полезен для полей ManyToManyField и ForeignKey ? Например, учитывая следующий код, каков эффект related_name='maps' ?

Атрибут related_name указывает имя обратного отношения от модели User к вашей модели.

Если вы не укажете related_name , Django автоматически создаст его, используя имя вашей модели с суффиксом _set , например User.map_set.all() .

Если вы делаете , укажите, например, related_name=maps в модели User , User.map_set все еще будет работать, но синтаксис User.maps. , очевидно, немного чище и менее неуклюж; например, если у вас есть объект пользователя current_user , вы можете использовать current_user.maps.all() , чтобы получить все экземпляры вашей модели Map , имеющие отношение к current_user .

В документации Django есть больше подробностей.

prefetch_related используется для данных предварительной выборки для данных отношения Многие ко многим и многие к одному. select_related предназначен для выбора данных из отношения с одним значением. Оба они используются для извлечения данных из их отношений из модели. Например, вы строите модель и модель, которая связана с другими моделями. Когда приходит запрос, вы также запрашиваете данные об их отношениях, и у Django есть очень хорошие механизмы для доступа к данным из их отношений, например, book.author.name , но когда вы повторяете список моделей для извлечения данных об их отношениях Django создает каждый запрос для каждого отдельного отношения данных. Чтобы преодолеть это, у нас есть prefetchd_related и selected_related

Добавление к существующему имени, связанного с ответом, является обязательным, если в модели 2 FK, указывающих на одну и ту же таблицу. Например, в случае спецификации

Поэтому, когда вам нужно будет получить доступ к этим данным, вы можете использовать только связанное имя

Это не работает иначе (по крайней мере, я не смог пропустить использование связанного имени в случае 2 FK для одной таблицы.)

Аргумент related_name также полезен, если у вас есть более сложные связанные имена классов. Например, если у вас есть отношение внешнего ключа:

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

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

3 ответа

Вы можете присоединиться к двум таблицам / моделям с помощью __ (двойное подчеркивание).

Вам нужно будет использовать подзапрос :

Наконец, я бы рекомендовал использовать DateTimeField для хранения дат вместо использования CharField .

Чтобы иметь возможность динамически изменять представление объекта, вы можете изменить сериализатор. Одним из способов фильтрации задач является предоставление serializers.SerializerMethodField , который фильтрует задачи динамически.

Однако мне не нравится такой подход. Я думаю, вы должны пересмотреть, как вы представляете данные. Такое ощущение, что вы слишком сильно связываете данные. Хотя я не знаю вашего варианта использования, поэтому не могу прийти с конкретными предложениями.

Кроме того, я изменил названия здесь, чтобы модели были единичными , как это принято.

what is related_name and related_query_name in django?

i have an issue with the code in django framework regarding to related_name and related_query_name in django. please django expert explain the related_name in django, the code is below:


It is the name of the relation in reverse. If one uses a plus, then no reverse is added. @WillemVanOnsem you should add your comment as an answer together with the link

Related Name

Django maintains backward relation on each object for easy access to related objects. Suppose you have two models named "School" and "Student" and one school can have multiple students. So you will have model definition something like this

Now if you have an school objects then you can access all students of that school with writing query explictly.

Here student_set is the default, related name made by Django. But you can have your custom related names like this

1 Answer 1

Special Character in related name

If you define related_name='+' then backward relation would not be available on object and school.student_set.all() will give you error.

If you’d prefer Django not to create a backwards relation, set related_name to '+' or end it with '+'. For example, this will ensure that the User model won’t have a backwards relation to this model:

Related Query Name

related_query_name is similar to related_name but it gets used in queryset.

If you need to apply some filter on student via school model, then you would do

2 ответа

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

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 . Джанго имеет разумные значения по умолчанию.

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

Обратите внимание, что запрос вперед выполняется Album_instance, за которым следует исполнитель (имя поля). и назад будет

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

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

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

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

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

Читайте также: