related_name – Django内置字段验证
related_name属性指定了从用户模型返回到你的模型的反向关系的名称。如果你没有指定related_name,Django会使用你的模型名称和后缀_set自动创建一个。
语法:
field_name = models.Field(related_name="name")
解释:
用一个例子说明related_name=”name”。考虑一个名为suorganizer(start up organizer)的项目,有一个名为organizer的应用程序。
在组织者应用程序的models.py文件中输入以下代码。
from django.db import models
# Create your models here.
class Tag(models.Model):
name = models.CharField(max_length = 31)
def __str__(self):
return self.name.title()
class Post(models.Model):
title = models.CharField(max_length = 63)
tags = models.ManyToManyField(Tag, related_name ='blog_posts')
def __str__(self):
return self.title
在Django上运行了makemigrations和migrate,并渲染了上述模型后,让我们尝试从Django shell上用None创建一个实例。要启动Django shell,请输入以下命令。
Python manage.py shell
现在让我们尝试用None创建Tag和Post的实例。
# importing required model
from organizer.models import Tag, Post
# creating instance of Tag model
r = Tag.objects.create(name ="django")
r.save()
# creating instance of Post model
s = Post.objects.create(title ="About django")
s.save()
# accessing objects
t = Tag.objects.get(name ="django")
p = Post.objects.get(title ="About django")
# method1--adding tag to post using post object
p.tags.add(t)
# method2--adding tag to post using tag object
# which is possible with related_name
t.blog_posts.add(p)
让我们在管理界面检查模型的实例是否已经创建。
1.标签对象。
2.Post object
在Django中,我们只在一个地方指定对称关系。related_name参数是定义关系的另一端。具体来说,给定一个Post实例p,与这个帖子相关的标签可以通过p.tags访问。然而,给定一个Tag实例t,我们没有明确定义一个变量来访问Post对象。多亏了related_name选项,我们现在可以通过blog posts属性访问与标签t相关的博客帖子列表,如t.blog_posts。related_name参数实际上是一个选项。如果我们不设置它,Django会自动为我们创建关系的另一端。在Tag模型的情况下,Django会创建一个post_set属性,在我们的例子中允许通过t.post_set访问。Django使用的公式是模型的名称,然后是字符串_set。因此,相关的名称参数只是覆盖了Django的默认值,而不是提供新的行为。