related_name — имя для обратного доступа от связанной модели к родительской.
Без related_name
class Task(models.Model):
project = models.ForeignKey(Project, on_delete=models.CASCADE)
# Обратный доступ — Django генерирует имя автоматически: <model>_set
project = Project.objects.get(pk=1)
project.task_set.all() # все задачи проекта
С related_name
class Task(models.Model):
project = models.ForeignKey(
Project,
on_delete=models.CASCADE,
related_name='tasks', # project.tasks вместо project.task_set
)
project.tasks.all()
project.tasks.filter(status='done')
project.tasks.count()
Пример с несколькими ForeignKey на одну модель
class Task(models.Model):
owner = models.ForeignKey(
User,
on_delete=models.CASCADE,
related_name='owned_tasks', # user.owned_tasks.all()
)
assignee = models.ForeignKey(
User,
on_delete=models.SET_NULL,
null=True,
blank=True,
related_name='assigned_tasks', # user.assigned_tasks.all()
)
Без related_name Django выдаст ошибку: конфликт имён.
related_name=’+’ — отключить обратный доступ
created_by = models.ForeignKey(
User,
on_delete=models.CASCADE,
related_name='+', # нет обратного доступа
)
В шаблоне
{% for task in project.tasks.all %}
<li>{{ task.title }}</li>
{% endfor %}
В сериализаторе DRF
class ProjectSerializer(serializers.ModelSerializer):
tasks = TaskSerializer(many=True, read_only=True) # через related_name
class Meta:
model = Project
fields = ['id', 'name', 'tasks']
💬 Комментарии (0)
Комментариев пока нет
Станьте первым, кто поделится мнением об этой статье!