Проблема проектирования со сложными валидациями в django - PullRequest
0 голосов
/ 12 июля 2020

У меня есть любимый проект о разделении расходов между людьми из какой-то группы (например, соседями по комнате). У меня есть некоторые проблемы с дизайном, связанные со сложными проверками, которые мне приходится выполнять для некоторых операций, которые удваивают количество запросов к базе данных. Интересно, есть ли более элегантные решения. Например, модели можно определять по-другому, эти проверки можно переносить в ограничения в базе данных и т. Д.

Теперь у меня есть 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)

Проблема здесь в том, что я должен проверять, что пользователь и его должники находятся в одном списке акций все время, когда я выполняю операции с их ( здесь несколько примеров). Это создает накладные расходы для базы данных. Есть ли для этого более удачные дизайнерские решения?

...