Нормализуйте модели правильным способом
У меня есть 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, но также является ли это правильным способом в дальнейшем.
Простите за длинный пост, но не хочу зайти так далеко, чтобы потом пришлось переделывать его.
Спасибо