Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/django/22.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
处理冗余Django模型继承_Django - Fatal编程技术网

处理冗余Django模型继承

处理冗余Django模型继承,django,Django,我试图弄清楚如何在Django模型中处理以下继承 class Address(models.Model): street = models.CharField() city = models.CharField() country = models.CharField() class Meta: abstract = True class Person(Address, models.Model): name = model

我试图弄清楚如何在Django模型中处理以下继承

class Address(models.Model):
     street = models.CharField()
     city = models.CharField()
     country = models.CharField()

     class Meta:
         abstract = True

class Person(Address, models.Model):
     name = models.CharField()

class Caffe(Address, models.Model):
     place_name = models.CharField()
     owner_name = models.CharField()
     signature_drink = models.CharField()
我知道我可以在地址之后继承,它仍然有效。但它看起来并不正确——它使代码和继承变得不清晰(假设每个模型位于不同的文件中)。而且,在我看来,从同一个类继承两次是冗余的(在不同的级别上,但仍然如此)。 或者这是Django标准可以接受的唯一方法?

仅供参考:有一些方法可以为您提供处理地址的字段

将AddressField或抽象类与基本字段或第三个选项一起使用的原因取决于您的项目要求:

  • 通过AddressField使用封装的地址模型来限制迁移量。此AddressField是ForeignKey的子类,具有一些额外的功能以确保正确存储信息。对地址模型的更改只是对地址模型的更改。所有地址都在一个地方
  • 当地址本身就是对象时,可以使用多表继承。这个地方和餐馆就是一个很好的例子。此外,你可以通过搜索一个地方,然后看看它是一家餐馆还是一家电影院来找到一个地方
  • 当您不希望模型之间共享信息时,请使用抽象模型。每次更改抽象模型时,都会为使用它的所有模型创建迁移。这可能成为相当大的负担

这里有一些需要注意的附加信息:

您不需要继承
模型中的
人员
Caffe
。模型
继承
人员
Caffe
地址时,已经继承了
模型。模型
。您的模型结构如下

class Address(models.Model):
     street = models.CharField()
     city = models.CharField()
     country = models.CharField()

     class Meta:
         abstract = True

class Person(Address):
     name = models.CharField()

class Caffe(Address):
     place_name = models.CharField()
     owner_name = models.CharField()
     signature_drink = models.CharField()

这不是钻石遗产。例如,如果
Caffe
将继承
地址
个人
@WillemVanOnsem的话,钻石继承就是一个例子。谢谢你更新了我的知识。从问题中删除了菱形继承。我不会说在
app1.models
中继承从
app2.models
模块导入的内容时,菱形继承会使继承变得不清晰。此外,模型通常在“视觉上”与其他类非常不同,具有字段等。顺便说一句,你看过报纸了吗?如果有疑问,遵循他们使用的惯例通常是个好主意。