透明地继承Django模型属性

我一直在为如何在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_attr1shared_attr2更改时,MyModel我要实现以下行为:

  1. 如果外键为null,则将值保存在MyModel

  2. 如果外键不为null,并且该值不同于与外键链接的记录共享的值,则将该值保存在上MyModel

  3. 否则,将该值留空。

然后,当我从上的任何一个共享属性中检索值时MyModel,我希望它执行以下操作:

  1. 如果外键为null,则返回on的属性值MyModel

  2. 如果外键不为null,并且on的值与on的值MyModel不同MyModelGroup,则返回on的值MyModel

  3. 如果外键不为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

这些方法都不符合我的预期。你们有没有实现过类似的东西?


繁星淼淼
浏览 144回答 2
2回答

12345678_0001

在我看来,拥有这种功能的最好方法是创建“自定义Django字段”。保存前使用pre_save调整值。比为该字段定义getter,并且setter使用pre_save方法在将值传递到数据库之前将其转换。
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Python