Django DRY Модели - PullRequest
       6

Django DRY Модели

0 голосов
/ 26 февраля 2020

В общем, как мне сохранить мои модели 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)

Ответы [ 3 ]

1 голос
/ 26 февраля 2020

Нормализуйте структуру вашей базы данных, вы можете еще больше нормализовать адрес

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)
0 голосов
/ 26 февраля 2020

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)

Предыдущие ответы могут служить вашей цели лучше, но это вариант.

0 голосов
/ 26 февраля 2020

Просто добавьте ссылки:

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')
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...