0

一般来说,当我必须多次重复多个属性时,如何保持模型 DRY?

例如:

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)
4

3 回答 3

1

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

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)
于 2020-02-26T12:48:02.413 回答
0

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

要使用抽象模型重构代码,我会这样写:

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)

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

于 2020-02-26T13:30:26.387 回答
0

只需添加参考:

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')
于 2020-02-26T12:47:44.670 回答