我一直在为如何在Django 1.7上实现以下功能而绞尽脑汁。我有两个Django模型。一个字段上的某些字段在另一个字段上重复。就像这样,它们与外键相关。
class MyModelGroup(models.Model):
name = models.CharField(max_length=128)
shared_attr1 = models.NullBooleanField()
shared_attr2 = models.CharField(max_length=512, null=True, blank=True)
class MyModel(models.Model):
group = models.ForeignKey(MyModelGroup, null=True, blank=True)
name = models.CharField(max_length=128)
shared_attr1 = models.NullBooleanField()
shared_attr2 = models.CharField(max_length=512, null=True, blank=True)
MyModel可能与MyModelGroup记录有关。当shared_attr1或shared_attr2更改时,MyModel我要实现以下行为:
如果外键为null,则将值保存在MyModel。
如果外键不为null,并且该值不同于与外键链接的记录共享的值,则将该值保存在上MyModel。
否则,将该值留空。
然后,当我从上的任何一个共享属性中检索值时MyModel,我希望它执行以下操作:
如果外键为null,则返回on的属性值MyModel。
如果外键不为null,并且on的值与on的值MyModel不同MyModelGroup,则返回on的值MyModel。
如果外键不为null,并且on的MyModel值为null,则返回on的值MyModelGroup。
目的是允许一堆MyModel从中继承值MyModelGroup,并可能通过在上存储不同的值来覆盖这些值MyModel。
我曾尝试推行__getattr__,并__setattr__在MyModel透明照顾如果外键存在检查和获取并在适当设定值,但Django是做了很多神奇的东西,使得这一困难。
我也尝试使用计算字段来实现它,如下所示:
@property
def shared_attr1(self):
# renamed model field to _shared_attr1
if self.group and self._shared_attr1 is None:
return self.group._shared_attr1
return self._shared_attr1
@shared_attr1.setter
def shared_attr1(self, new_value):
if self.group is None or new_value != self.group._shared_attr1:
self._shared_atttr1 = new_value
这些方法都不符合我的预期。你们有没有实现过类似的东西?
12345678_0001
相关分类