django, для чего связано related_name? и как мне создать общие столбцы для использования в проекте? - PullRequest
10 голосов
/ 18 декабря 2010

Я пытался создать модель в Django с некоторыми областями одитинга. Например, созданный в, созданный, обновленный в и обновленный. Эти четыре столбца будут повторяться для всех моих моделей в разных приложениях.

Мой первый вопрос, есть ли способ поместить эти столбцы и включать их в мой класс каждый раз, когда они мне нужны?

Мой второй вопрос, какой смысл в атрибуте related_name в приведенном ниже коде? без него код вернет ошибку, плюс значение должно быть уникальным во всем приложении. Есть ли способ обеспечить его всегда уникальным?

class Poll(models.Model):
    question=models.CharField(max_length=300)
    start_poll_at=models.DateTimeField(null=True)
    end_poll_at=models.DateTimeField(null=True)
    is_active=models.BooleanField(default=True)
    created_at=models.DateField("Created at")
    created_by=models.ForeignKey(User, db_column="created_by", related_name="poll_user_created_by")
    updated_at=models.DateTimeField("Updated at")
    updated_by=models.ForeignKey(User, db_column="updated_by", null=True, related_name="poll_user_updated_by")


class Choice(models.Model):
    choice=models.CharField(max_length=200)
    created_at=models.DateField("Created at")
    created_by=models.ForeignKey(User, db_column="created_by", related_name="poll_user_created_by")
    updated_at=models.DateTimeField("Updated at")
    updated_by=models.ForeignKey(User, db_column="updated_by", null=True, related_name="poll_user_updated_by")

Спасибо

1 Ответ

7 голосов
/ 18 декабря 2010

Попробуйте это:

class AbstractClass(models.Model):
    created_at=models.DateField("Created at")
    created_by=models.ForeignKey(User, db_column="created_by", related_name="poll_user_created_by")
    updated_at=models.DateTimeField("Updated at")
    updated_by=models.ForeignKey(User, db_column="updated_by", null=True, related_name="poll_user_updated_by")
    class Meta:
        abstract = True

А затем используйте его как базу для других моделей:

class Poll(AbstractClass):
    question=models.CharField(max_length=300)
    start_poll_at=models.DateTimeField(null=True)
    end_poll_at=models.DateTimeField(null=True)
    is_active=models.BooleanField(default=True)

Это документация Django об этом: http://docs.djangoproject.com/en/dev/topics/db/models/#abstract-base-classes

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