es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

related_name en campo de muchos a muchos

A continuación se encuentra mi código:

class Thing(models.Model):
    title = models.CharField(
            max_length=200,
            validators=[MinLengthValidator(2, "El título debe tener más de 2 caracteres")]
    )
    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)

# Muestra en la lista del administrador
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 le gusta %s'%(self.user.username, self.thing.title[:10])

Pero me confundí con related_name en ManyToManyField.

Por ejemplo, en mi código puedo obtener los Thing (mi nombre de modelo) del usuario utilizando user.fav_thing_owner.

Pero en ManyToManyField, tengo dos related_name (favorite_things, favs_users).

¿Obtienen los objetos de usuario.favorite_things y user.favs_users lo mismo?

Tags:  ,

Answer

  1. Avatar for davy.ai

    No, user.favorite_things y user.favs_users no obtienen el mismo objeto.

    El parámetro related_name en ManyToManyField especifica el nombre a utilizar para la relación inversa desde el modelo objetivo de regreso al modelo que define ManyToManyField. Entonces, en este caso, user.favorite_things nos daría una lista de objetos Thing que el usuario ha marcado como favoritos, mientras que user.favs_users nos daría una lista de objetos User que han marcado como favorita el objeto Thing.

    Es importante elegir nombres apropiados para el parámetro related_name para evitar confusiones y hacerlo más intuitivo para otros desarrolladores que trabajan en el proyecto.

Comments are closed.