为了账号安全,请及时绑定邮箱和手机立即绑定

透明地继承Django模型属性

透明地继承Django模型属性

繁星淼淼 2021-03-29 17:19:46
我一直在为如何在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是做了很多神奇的东西,使得这一困难。我也尝试使用计算字段来实现它,如下所示:@propertydef 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.setterdef shared_attr1(self, new_value):    if self.group is None or new_value != self.group._shared_attr1:        self._shared_atttr1 = new_value这些方法都不符合我的预期。你们有没有实现过类似的东西?
查看完整描述

2 回答

?
12345678_0001

TA贡献1802条经验 获得超5个赞

在我看来,拥有这种功能的最好方法是创建“自定义Django字段”。保存前使用pre_save调整值。

比为该字段定义getter,并且setter使用pre_save方法在将值传递到数据库之前将其转换。


查看完整回答
反对 回复 2021-04-09
  • 2 回答
  • 0 关注
  • 142 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信