Как правильно подключать модели в 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()

Код не протестирован, поэтому если у вас возникнут какие-либо проблемы, укажите их в комментариях, мы обновим ответы соответствующим образом.

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