【发布时间】:2022-01-09 06:33:40
【问题描述】:
我有模型,对象可以表示为有向图:
from django.db import models
from django.contrib.auth.models import User
class Record(models.Model):
name = models.CharField(max_length=100)
description = models.CharField(max_length=500)
content = models.TextField()
sequels = models.ManyToManyField('self', blank=True, symmetrical=False, through='Extend', related_name='extending')
author = models.ForeignKey(User, on_delete=models.CASCADE)
class Extend(models.Model):
ancestor = models.ForeignKey(Record, on_delete=models.CASCADE, related_name='+')
descendant = models.ForeignKey(Record, on_delete=models.CASCADE, related_name='+')
class Meta:
constraints = [
models.UniqueConstraint(
name="%(app_label)s_%(class)s_unique_relationships",
fields=["ancestor", "descendant"],
),
models.CheckConstraint(
name="%(app_label)s_%(class)s_prevent_self_extend",
check=~models.Q(ancestor=models.F("descendant")),
),
]
任何时候创建Record 的新实例并且它通过Extend 模型与另一个实例有关系,我很想在User 实例中计算author.user.userprofile.income 属性。问题是我不知道如何为新创建的Record 的所有祖先计算这个属性,它遵循一些规则:如果新创建的Record 成本为 50,则第一级祖先获得 25 和 25 去其他祖先,不断被2除。
一级祖宗的公式我可以写,别人怎么写?
# In case of some purchase:
class ExtendPurchase(models.Model):
user = models.ForeignKey(User, on_delete=models.CASCADE)
items = models.ManyToManyField(Record)
date = models.DateField(auto_now_add=True)
cost = models.PositiveIntegerField()
def calculate_income(self):
for item in self.items.all():
item.author.userprofile.income += self.cost / len(self.items.all()) / 2 # first-level; if one would like to extend more than one Record instance
for ancestor in item.extending.all():
ancestor.author.userprofile.income += self.cost / delimiter # I don't know what delimiter is to be written
self.items.save()
【问题讨论】:
-
您可能希望使用例如django-treebeard.readthedocs.io/en/latest有效地检索所有父母
-
有了 django-treebeard,我看不到从两个或多个父级继承的实现。
标签: django django-models many-to-many