#django #django-models
Вопрос:
Ниже приведен мой код.
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])
Но я запутался в имени, связанном со многими людьми.
например, в моем коде я могу получить вещь пользователя(имя моей модели), используя user.fav_thing_owner.
Но в ManyToManyField у меня есть два связанных имени(favorite_things, favs_users).
user.favorite_things и user.favs_users получают один и тот же объект..?
Комментарии:
1. Нет,
user.favorite_thing
вы получитеThing
запрос на набор объектов, в тоuser.favs_user
время как получите запрос на набор связанныхFav
объектов.
Ответ №1:
user.favorite_things
иuser.favs_users
получить тот же объект..?
Нет, user.favorite_thing.all()
вы получите Thing
набор запросов объектов, в то user.favs_user.all()
время как получите набор запросов связанных Fav
объектов.
Fav
Объекты, которые вы получаете user.favs_user.all()
, таким образом, будут указывать на Thing
объекты, которые вы получаете user.favorite_thing.all()
. Если ваши Fav
объекты содержат больше данных, например, отметку времени, когда вы сделали это Thing
своим любимым, поэтому иногда может быть полезно Fav
вместо этого выбрать объекты, а затем перечислить их по .thing
буквам s, на которые Fav
ссылаются эти объекты.
Буквы related_name=…
s выглядят немного странно. Обычно это имя для извлечения отношения в обратном порядке. Возможно, лучше переименовать favs_user
в favorites
или что-то в этом роде.