django использует колонки из других моделей без наследования - PullRequest
0 голосов
/ 24 декабря 2010

Я не совсем уверен, что то, что я собираюсь сделать, программно возможно. Хотя, если это сработает, мне очень поможет организовать мой код.

class AuditColumns(models.Model):
    created_at=models.DateField("Created at")
    created_by=models.ForeignKey(User, db_column="created_by", related_name="%(app_label)s_%(class)s_y+")
    updated_at=models.DateTimeField("Updated at")
    updated_by=models.ForeignKey(User, db_column="updated_by", null=True, blank=True, related_name="%(app_label)s_%(class)s_y+")
    class Meta:
        abstract = True
    def return_audit_columns(self):
        return self.created_at, self.created_by, self.updated_at, self.updated_by

class Choice(models.Model):
    choice=models.CharField(max_length=200)

    def __init__(self):
        self.created_at, self.created_by, self.updated_at, self.updated_by=AuditColumns.return_audit_columns(self)

приведенный выше код не работает, это была моя попытка или то, что я хочу сделать. По сути, у меня есть класс AuditColumns, который содержит этот набор столбцов, и я хочу использовать их в разных моделях в своих проектах. Я не хочу, чтобы модель Choice наследовала от AuditColumns, потому что я собираюсь использовать ту же технику для включения других столбцов из других источников в мой класс Choice.

Конечно, то, что я написал выше, также не практично, потому что мне придется повторять имена столбцов каждый раз, когда я хочу включить AuditColumns в одну из моделей в моем проекте.

То, что я хочу сделать, достижимо или нет?

Ответы [ 2 ]

4 голосов
/ 24 декабря 2010

Обычный способ сделать это с типами контента . Вы создаете модель, аналогичную AuditColumns, но вы также включаете другое поле, GenericForeignKey, которое может указывать на любую модель в базе данных проекта.

2 голосов
/ 24 декабря 2010

Python позволит вам выполнять множественное наследование, чтобы вы могли наследовать атрибуты нескольких базовых классов в свой класс Choice, что может быть тем, что вам нужно.

class Choice(AuditColumns,Foo):
    choice=models.CharField(max_length=200)

даст вашему классу Choice атрибуты классаКласс AuditColumns и класс Foo.Вы также неправильно используете себя в своем примере.Вы вызываете метод return_audit_columns класса AuditColumns, который ожидает экземпляр этого класса, но передает экземпляр класса Choice, а это не то, что вам нужно.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...