我一直在为如何在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
相关分类