关于如何在django1.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
上更改时,我希望实现以下行为:
如果外键为空,只需将值保存在MyModel
。
如果外键不为null,并且该值与与与该外键链接的记录上共享的值不同,请将该值保存在MyModel
。
否则,将该值留空。
然后,当我从MyModel
上的任一共享属性检索值时,我希望它执行以下操作:
如果外键为null,则返回MyModel
上属性的值。
如果外键不为null,MyModel
上的值与MyModelGroup
上的值不同,则返回MyModel
上的值。
如果外键不为null,MyModel
上的值为null,则返回MyModelGroup
上的值。
其目的是允许一堆MyModel
从MyModelGroup
继承值,并且可以通过在MyModel
上存储不同的值来重写这些值。你知道吗
我已经尝试在MyModel
上实现__getattr__
和__setattr__
,以透明地检查外键是否存在,并在适当的情况下获取和设置值,但是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
这两种方法都没有达到我的预期效果。你们中有人以前实现过这样的东西吗?你知道吗
我不想太花哨。为什么不在“MyModel”上使用一个非常简单的方法来返回适当的值:
并处理
save
中正确状态的保持:您必须处理组的
save
中组的属性发生更改的情况:从我的角度来看,拥有这种功能的最佳方法是创建Custom Django Field。保存前使用pre_save调整值。你知道吗
然后为字段定义getter,作为setter,在值进入数据库之前使用pre_save方法转换值。你知道吗
灵感请参见You can see django.db.fields。你知道吗
相关问题 更多 >
编程相关推荐