У меня есть любимый проект о разделении расходов между людьми из какой-то группы (например, соседями по комнате). У меня есть некоторые проблемы с дизайном, связанные со сложными проверками, которые мне приходится выполнять для некоторых операций, которые удваивают количество запросов к базе данных. Интересно, есть ли более элегантные решения. Например, модели можно определять по-другому, эти проверки можно переносить в ограничения в базе данных и т. Д.
Теперь у меня есть 3 основные модели: Users
, Sharelist
, Credit
и Debt
. Лог c выглядит следующим образом: Sharelist
объединяет людей в группы для разделения расходов между ними. Модель Credit
создается, когда кто-то за что-то заплатил, а модель Debt
создается для тех, кто ему должен деньги. Код здесь , а вот упрощение:
from django.db import models
from django.contrib.auth.models import User
class Sharelist(models.Model):
name = models.CharField(max_length=30)
users = models.ManyToManyField(User)
class Credit(models.Model):
name = models.CharField(max_length=30)
datetime = models.DateTimeField()
amount = models.DecimalField(max_digits=19, decimal_places=2)
creditor = models.ForeignKey(User, on_delete=models.PROTECT)
sharelist = models.ForeignKey(Sharelist, on_delete=models.PROTECT)
class Debt(models.Model):
debtor = models.ForeignKey(User, on_delete=models.PROTECT)
credit = models.ForeignKey(Credit, on_delete=models.CASCADE, related_name='debts')
amount = models.DecimalField(max_digits=19, decimal_places=2)
Проблема здесь в том, что я должен проверять, что пользователь и его должники находятся в одном списке акций все время, когда я выполняю операции с их ( здесь несколько примеров). Это создает накладные расходы для базы данных. Есть ли для этого более удачные дизайнерские решения?