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?
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 conUser
en lugar de una relación uno a uno conIngredient
. De esta manera, cada instancia deUserIngredient
puede hacer referencia a una instancia deIngredient
, pero con el campo adicionalnumOf
específico para ese usuario.Aquí tienes el modelo actualizado de
UserIngredient
: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 deUserIngredient
, cada una con un valornumOf
de 2 y una referencia de clave externa al primer usuario y a la única instancia de “Apple” deIngredient
.Para recuperar todos los ingredientes y sus cantidades individuales en el refrigerador de un usuario, puedes usar un
QuerySet
con un objetoPrefetch
:Esto recuperará todas las instancias de
Ingredient
junto con sus instancias asociadas deUserIngredient
filtradas por un usuario específico.