Нормализуйте модели правильным способом

У меня есть 4 модели Profile, Product, Holding и Transaction. Пользователь (профиль) может назначать продукты своему аккаунту.

Затем я хочу, чтобы пользователь мог добавить транзакцию к продукту, то есть он может добавить 10 единиц продукта и цену, которую он заплатил, которая затем будет представлена в таблице, показывающей общую сумму, которую он держит, а также среднюю цену.

Но я не уверен, что то, что я делаю, правильно с точки зрения полей FKs и MtM.

class Product(models.Model):
    name = models.CharField(max_length=255, blank=False, unique=True)
    slug = models.CharField(max_length=50, blank=True,null=True)
    symbol = models.CharField(max_length=50, blank=True,null=True)
    price = models.DecimalField(max_digits=10, decimal_places=2, blank=True, null=True)
    capture_date = models.DateField(blank=True,null=True)
    logo_address = models.URLField(max_length=255, blank=True)

    def __str__(self):
        return self.name

class Profile(models.Model):
    user = models.OneToOneField(User, on_delete=models.CASCADE)
    bio = models.TextField(max_length=500, blank=True)
    location = models.CharField(max_length=30, blank=True)
    birth_date = models.DateField(null=True, blank=True)
    website = models.URLField(max_length=50, blank=True)
    twitter = models.CharField(max_length=50, blank=True)
    meta = models.CharField(max_length=50, blank=True)
    github = models.CharField(max_length=50, blank=True)

    def __str__(self):
        return str(self.user)

class Holding(models.Model):
    product = models.ForeignKey(Product, on_delete=models.CASCADE)
    profile = models.ForeignKey(Profile, on_delete=models.CASCADE)

    def __str__(self):
        return str(self.product_name)

class Transaction(models.Model):

    product = models.ForeignKey(Holding, on_delete=models.CASCADE)
    amount = models.DecimalField(max_digits=10, decimal_places=2, blank=True, null=True)
    price = models.FloatField(max_length=50, blank=True, null=True)
    transaction_date = models.DateField(null=True, blank=True)
    profile = models.ForeignKey(Profile, on_delete=models.CASCADE)

Я подумал, что могу избавиться от модели holding и просто использовать Transaction, так как это упростит формы, используемые для выбора продукта и добавления деталей транзакции. Но проблема в том, что продукт может появляться несколько раз для пользователя, так как у него может быть несколько транзакций с этим продуктом, и поэтому, когда я перечисляю продукты, я хочу, чтобы название продукта появлялось в таблице только один раз. Вот почему я использовал holding, так как название продукта уникально для продукта пользователя.

Так как я делаю это неправильно с моделями - есть ли способ сгруппировать продукты вместе, чтобы показывать название продукта только один раз, чтобы модель transaction могла заменить Holding, но также является ли это правильным способом в дальнейшем.

Простите за длинный пост, но не хочу зайти так далеко, чтобы потом пришлось переделывать его.

Спасибо

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