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.

Cómo conectar correctamente modelos en Django?

En mi proyecto, quiero tener una base de datos global de ingredientes. También quiero que cada usuario tenga la posibilidad de agregar un ingrediente a su propio modelo de refrigerador, pero con un campo adicional “numOf”. He encontrado errores con la solicitud PATCH y estoy pensando que mi base de datos está conectada incorrectamente. ¿Alguien tiene una mejor idea de cómo organizar mis modelos?

Modelos de Ingredientes

class Ingredient(models.Model):
   name = models.CharField(max_length=100)

class UserIngredient(models.Model):
   ingredient = models.OneToOneField(Ingredient, unique=True, on_delete=models.CASCADE)
   numOf = models.IntegerField(default=1)

Modelo de Refrigerador

class Fridge(models.Model):
    owner = models.OneToOneField(User, related_name='fridge', on_delete=models.CASCADE)
    ingredients = models.ManyToManyField(UserIngredient, blank=True)

def __str__(self):
    return self.owner.username + "'s Fridge"

def save(self, *args, **kwargs):
    super().save(*args, **kwargs)

Por ejemplo, dejemos que el primer usuario tenga 2 manzanas, el segundo 3 manzanas y el tercer usuario 4 manzanas en su refrigerador. Luego, en la tabla UserIngredient, tengo 3 registros: Apple 2, Apple 3, Apple 4, que apuntan a una única instancia de Apple Ingredient. ¿Cómo puedo evitar esta redundancia y simplemente apuntar a una instancia de Ingredient?

Tags:  ,

Answer

  1. Avatar for davy.ai

    Parece que los modelos están configurados correctamente, sin embargo, el problema puede residir en cómo se está realizando la solicitud PATCH. ¿Estás recibiendo algún error específico o mensaje de error que pueda ayudar a identificar el problema en mayor medida?

    En cuanto a evitar la redundancia, puedes cambiar el modelo UserIngredient para tener una relación de clave externa con User en lugar de una relación uno a uno con Ingredient. De esta manera, cada instancia de UserIngredient puede hacer referencia a una instancia de Ingredient, pero con el campo adicional numOf específico para ese usuario.

    Aquí tienes el modelo actualizado de UserIngredient:

    class UserIngredient(models.Model):
       user = models.ForeignKey(User, on_delete=models.CASCADE)
       ingredient = models.ForeignKey(Ingredient, on_delete=models.CASCADE)
       numOf = models.IntegerField(default=1)
    

    Ahora, si el primer usuario agrega 2 manzanas a su refrigerador, tendrías una única instancia de Ingredient con el nombre “Apple”, y dos instancias separadas de UserIngredient, cada una con un valor numOf de 2 y una referencia de clave externa al primer usuario y a la única instancia de “Apple” de Ingredient.

    Para recuperar todos los ingredientes y sus cantidades individuales en el refrigerador de un usuario, puedes usar un QuerySet con un objeto Prefetch:

    ingredients = Ingredient.objects.prefetch_related(
        Prefetch('useringredient_set', queryset=UserIngredient.objects.filter(user=user))
    )
    

    Esto recuperará todas las instancias de Ingredient junto con sus instancias asociadas de UserIngredient filtradas por un usuario específico.

Comments are closed.