Skip to content

Instantly share code, notes, and snippets.

@AlonsoMackenlly
Created April 9, 2021 08:19
Show Gist options
  • Save AlonsoMackenlly/27dbccef02b132a462ba9d433cb62c4a to your computer and use it in GitHub Desktop.
Save AlonsoMackenlly/27dbccef02b132a462ba9d433cb62c4a to your computer and use it in GitHub Desktop.
from django.db import models
from django.contrib.contenttypes.fields import GenericForeignKey
from django.contrib.contenttypes.models import ContentType
from django.contrib.contenttypes.fields import GenericRelation
# создадим класс, хранящий множество записей, которые могут привязываться к разным моделями
class Accumulator(models.Model):
# Ссылка на встроенную модель, где фигурируют все модели всех зарегистрированных приложений
content_type = models.ForeignKey(ContentType, on_delete = models.PROTECT, editable = False, db_index = True)
# Ключ самого объекта, на который ссылаемся
object_id = models.UUIDField(editable = False, db_index = True)
# "Виртуальное" поле, в котором/через который взаимодействуем с объектом
content_object = GenericForeignKey('content_type', 'object_id')
# то, что собираем из всех моделей
sum = models.DecimalField(max_digits = 12, decimal_places = 2, verbose_name = 'Сумма')
class CashIn(models.Model):
# Вопрос религиозный. Останавливаться не буду :)
uuid = models.UUIDField(primary_key = True, editable = False, default = uuid.uuid4)
# Что регистрирует текущая модель
sum = models.DecimalField(max_digits = 12, decimal_places = 2, verbose_name = 'Сумма')
# Ссылка в объекте модели на записи
accumulator = GenericRelation(Accumulator)
# Переопределяем встроенные методы.
# Вопрос можно решить и через сигналы. Еще смотрю
def save(self, *args, **kwargs):
super(CashIn, self).save(*args, **kwargs)
self.accumulator.all().delete()
self.accumulator.create(sum = self.sum)
def delete(self, using = None, keep_parents = False):
self.accumulator.all().delete()
super(CashIn, self).delete(using = using, keep_parents = keep_parents)
# Аналогичен CashIn, но записывает в другую сторону сумму
class CashOut(models.Model):
uuid = models.UUIDField(primary_key = True, editable = False, default = uuid.uuid4)
sum = models.DecimalField(max_digits = 12, decimal_places = 2, verbose_name = 'Сумма')
accumulator = GenericRelation(Accumulator)
def save(self, *args, **kwargs):
super(CashOut, self).save(*args, **kwargs)
self.accumulator.all().delete()
self.accumulator.create(sum = -self.sum)
def delete(self, using = None, keep_parents = False):
self.accumulator.all().delete()
super(CashOut, self).delete(using = using, keep_parents = keep_parents)
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment