Как правильно подключать модели в Django?
В моем проекте я хочу иметь глобальную базу данных ингредиентов. Я также хочу, чтобы каждый пользователь имел возможность добавить ингредиент в свою собственную модель холодильника, но с дополнительным полем "numOf". Я столкнулся с ошибками при запросе PATCH и думаю, что моя база данных неправильно подключена. Может быть, у кого-нибудь есть идеи, как лучше организовать мои модели?
Модели ингредиентов
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)
Модель холодильника
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)
Например, пусть у 1-го пользователя в холодильнике 2 яблока, у 2-го 3 яблока и у 3-го 4 яблока. Тогда в таблице UserIngredient у меня есть 3 записи: Apple 2, Apple 3, Apple 4, которые все указывают на один ингредиент Apple. Как я могу избежать этой избыточности и просто указать на экземпляр ингредиента?
Change OneToOneField To ForeignKey
class Fridge(models.Model):
owner = models.ForeignKey(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)
Просто измените ManyToMany
на ForeignKey
и подключите это к Ingredient
модели, так как я думаю, что UserIngredient
не нужно, а для numOf
атрибута вы можете вычислить его как свойство следующим образом:
class Fridge(models.Model):
# rest of the code
ingredients = models.ForeignKeyField(Ingredient, on_delete=models.CASCADE, blank=True)
# rest of the code
@property
def num_of_ingredients(self):
return self.ingredients.count()
Код не протестирован, поэтому если у вас возникнут какие-либо проблемы, укажите их в комментариях, мы обновим ответы соответствующим образом.