Python Django:铸造抽象模型

Python Django:铸造抽象模型,python,django,Python,Django,我有一个抽象的Django模型,用于创建另外两个模型。在处理下面的不同示例时,如何避免重复代码(例如,在创建盒装麦片和保龄球麦片时,我希望避免重复函数两次 class Cereal(models.Model): name = models.CharField() class Meta: abstract = True class Boxed(Cereal): pass class Bowled(Cereal): pass func some

我有一个抽象的Django模型,用于创建另外两个模型。在处理下面的不同示例时,如何避免重复代码(例如,在创建盒装麦片和保龄球麦片时,我希望避免重复函数两次

class Cereal(models.Model):
    name = models.CharField()
    class Meta:
        abstract = True

class Boxed(Cereal):
    pass

class Bowled(Cereal):
    pass


func some_func_boxed(name):
    boxed = Boxed.objects.get(id=1)
    boxed.name = name
    boxed.save()

func some_func_bowled(name):
    bowled = Bowled.objects.get(id=1)
    bowled.name = name
    bowled.save()

您可以将其作为
@classmethod
添加到
谷物
模型中:

class Cereal(models.Model):
    name = models.CharField()

    @classmethod
    def some_func_cereal(cls, name):
        bowled = cls.objects.get(id=1)
        bowled.name = name
        bowled.save()

    class Meta:
        abstract = True
调用class方法的类作为
some\u func\u
函数中的
cls
参数传递

def some_func(name, Instance):
    i = Instance.objects.get(id=1)
    i.name = "some name"
    i.save()

好主意是使用
策略模式
,例如:

您可以向Graines Abstract类添加更新方法,例如:

class谷物:
def更新(自我,**kwargs):
对于键,kwargs.items()中的val:
setattr(自身、密钥、val)
self.save(update_fields=kwargs.keys())
回归自我
并按如下方式使用它来更新您喜欢的任何列

BoxedInstance.update(name=“new name”)
或
BoxedInstance.update(name=“new name”,taste=“cardboardy”)

为什么要使用这些函数(?)有一个不使用的
name
参数?看起来不正确。您的意图是什么?从字符域获取数据或用名称标记它?您正在创建一个带有
name
的字符域,然后将其替换为string@Piakkaa不,Django就是这样工作的。@WillemVanOnsem对不起,这个函数是一个人为的例子,我并不是这样的我只是在快速地写下一些东西。
def some_func(name, Instance):
    i = Instance.objects.get(id=1)
    i.name = "some name"
    i.save()