related_name 在多对多领域
related_name in many to many field
下面是我的代码。
class Thing(models.Model) :
title = models.CharField(
max_length=200,
validators=[MinLengthValidator(2, "Title must be greater than 2 characters")]
)
text = models.TextField()
owner = models.ForeignKey(settings.AUTH_USER_MODEL, on_delete=models.CASCADE,
related_name='fav_thing_owner')
favorites = models.ManyToManyField(settings.AUTH_USER_MODEL,
through='Fav', related_name='favorite_things')
created_at = models.DateTimeField(auto_now_add=True)
updated_at = models.DateTimeField(auto_now=True)
# Shows up in the admin list
def __str__(self):
return self.title
class Fav(models.Model) :
thing = models.ForeignKey(Thing, on_delete=models.CASCADE)
user = models.ForeignKey(settings.AUTH_USER_MODEL, on_delete=models.CASCADE,
related_name='favs_users')
# https://docs.djangoproject.com/en/3.0/ref/models/options/#unique-together
class Meta:
unique_together = ('thing', 'user')
def __str__(self) :
return '%s likes %s'%(self.user.username, self.thing.title[:10])
但我在 ManytoMayFied 中感到困惑 related_name。
例如,在我的代码中,我可以使用 user.fav_thing_owner.
获取用户的事物(我的模型名称)
但是在 ManyToManyField 中,我有两个 related_name(favorite_things, favs_users).
user.favorite_things 和 user.favs_users 得到相同的对象..?
user.favorite_things
and user.favs_users
get same object..?
No, user.favorite_thing.all()
会给你一个 Thing
objects 的查询集,而 user.favs_user.all()
会给你一个查询集相关 Fav
objects.
你用 user.favs_user.all()
得到的 Fav
objects 将因此指向你用 user.favorite_thing.all()
得到的 Thing
objects。如果您的 Fav
objects 包含更多数据,例如您将 Thing
设为收藏夹的时间戳,那么有时获取 Fav
objects,然后枚举这些 Fav
objects 所指的 .thing
。
related_name=…
看起来有点奇怪。通常它是反向获取关系的名称。也许最好将 favs_user
重命名为 favorites
或其他名称。
下面是我的代码。
class Thing(models.Model) :
title = models.CharField(
max_length=200,
validators=[MinLengthValidator(2, "Title must be greater than 2 characters")]
)
text = models.TextField()
owner = models.ForeignKey(settings.AUTH_USER_MODEL, on_delete=models.CASCADE,
related_name='fav_thing_owner')
favorites = models.ManyToManyField(settings.AUTH_USER_MODEL,
through='Fav', related_name='favorite_things')
created_at = models.DateTimeField(auto_now_add=True)
updated_at = models.DateTimeField(auto_now=True)
# Shows up in the admin list
def __str__(self):
return self.title
class Fav(models.Model) :
thing = models.ForeignKey(Thing, on_delete=models.CASCADE)
user = models.ForeignKey(settings.AUTH_USER_MODEL, on_delete=models.CASCADE,
related_name='favs_users')
# https://docs.djangoproject.com/en/3.0/ref/models/options/#unique-together
class Meta:
unique_together = ('thing', 'user')
def __str__(self) :
return '%s likes %s'%(self.user.username, self.thing.title[:10])
但我在 ManytoMayFied 中感到困惑 related_name。
例如,在我的代码中,我可以使用 user.fav_thing_owner.
获取用户的事物(我的模型名称)但是在 ManyToManyField 中,我有两个 related_name(favorite_things, favs_users).
user.favorite_things 和 user.favs_users 得到相同的对象..?
user.favorite_things
anduser.favs_users
get same object..?
No, user.favorite_thing.all()
会给你一个 Thing
objects 的查询集,而 user.favs_user.all()
会给你一个查询集相关 Fav
objects.
你用 user.favs_user.all()
得到的 Fav
objects 将因此指向你用 user.favorite_thing.all()
得到的 Thing
objects。如果您的 Fav
objects 包含更多数据,例如您将 Thing
设为收藏夹的时间戳,那么有时获取 Fav
objects,然后枚举这些 Fav
objects 所指的 .thing
。
related_name=…
看起来有点奇怪。通常它是反向获取关系的名称。也许最好将 favs_user
重命名为 favorites
或其他名称。