首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Django DRY模型

Django DRY模型
EN

Stack Overflow用户
提问于 2020-02-26 20:36:09
回答 3查看 65关注 0票数 0

一般来说,当我不得不多次重复几个属性时,我如何保持模型干燥?

例如:

代码语言:javascript
复制
class Event(models.Model):
    title = models.CharField(max_length=255)
    postal_code = models.CharField(max_length=5)
    city = models.CharField(max_length=50)
    street = models.CharField(max_length=50)
    street_nr = models.CharField(max_length=5)

class Person(models.Model):
    name = models.CharField(max_length=50)
    postal_code = models.CharField(max_length=5)
    city = models.CharField(max_length=50)
    street = models.CharField(max_length=50)
    street_nr = models.CharField(max_length=5)
EN

回答 3

Stack Overflow用户

发布于 2020-02-26 20:48:02

规范化您的数据库结构,您可以进一步规范化地址

代码语言:javascript
复制
class Adress(models.Model):
    postal_code = models.CharField(max_length=5)
    city = models.CharField(max_length=50)
    street = models.CharField(max_length=50)
    street_nr = models.CharField(max_length=5)

class Event(models.Model):
    title = models.CharField(max_length=255)
    address = models.ForeignKey(Adress, on_delete=models.CASCADE)

class Person(models.Model):
    name = models.CharField(max_length=50)
    address = models.ForeignKey(Adress, on_delete=models.CASCADE)
票数 1
EN

Stack Overflow用户

发布于 2020-02-26 20:47:45

只需添加引用:

代码语言:javascript
复制
class AdressData(models.Model):
    postal_code = models.CharField(max_length=5)
    city = models.CharField(max_length=50)
    street = models.CharField(max_length=50)
    street_nr = models.CharField(max_length=5)

class Event(models.Model):
    title = models.CharField(max_length=255)
    address_data = models.ForeignKey('AdressData')

class Person(models.Model):
    name = models.CharField(max_length=50)
    address_data = models.ForeignKey('AdressData')
票数 0
EN

Stack Overflow用户

发布于 2020-02-26 21:30:26

Django模型可以使用Python的对象继承来共享公共数据;但有一个规定。这些被称为abstract models

为了使用抽象模型重构你的代码,我会这样写它:

代码语言:javascript
复制
class BaseAddressModel(models.Model):
    postal_code = models.CharField(max_length=5)
    city = models.CharField(max_length=50)
    street = models.CharField(max_length=50)
    street_nr = models.CharField(max_length=5)

    class Meta:
        abstract = True


class Event(BaseAddressModel):
    title = models.CharField(max_length=255)


class Person(BaseAddressModel):
    name = models.CharField(max_length=50)

前面的答案可能会更好地满足您的目的,但这是一个选择。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/60414094

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档