Имя_родственника в поле "многие ко многим

Ниже приведен мой код.

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])

Но я перепутал related_name в ManytoMayFied.

Например, в моем коде я могу получить Вещь пользователя (имя моей модели), используя user.fav_thing_owner.

Но в ManyToManyField у меня есть два related_name(favorite_things, favs_users).

user.favorite_things и user.favs_users получают один и тот же объект...?

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, на которые ссылаются эти Fav объекты.

Имена related_name=… выглядят немного странно. Обычно это имя для получения отношения в обратном порядке. Возможно, лучше переименовать favs_user в favorites или что-то в этом роде.

Вернуться на верх