Как вы расширяете модель сайта в django? - PullRequest
8 голосов
/ 12 мая 2010

Каков наилучший подход к расширению модели сайта в django? Создание новой модели и ForeignKey сайта или есть другой подход, который позволяет мне подкласс модели сайта?

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

Ответы [ 4 ]

8 голосов
/ 13 мая 2010

Я просто использовал свой собственный подкласс сайта и создал для него собственного администратора.

По сути, когда вы создаете подкласс модели в django, он создает FK, указывающий на родительскую модель, и позволяет прозрачно обращаться к полям родительской модели - так же, как вы обращаетесь к атрибутам родительского класса в pyhon. Встроенный администратор никак не пострадает, но вам придется отменить регистрацию Сайтов ModelAdmin и зарегистрировать свой собственный ModelAdmin.

4 голосов
/ 13 мая 2010

Если вы хотите только изменить поведение объекта, но не добавлять какие-либо новые поля, вам следует рассмотреть возможность использования «прокси-модели» (впервые в Django 1.1). Вы можете добавить дополнительные методы Python к существующим моделям и многое другое:

Для наследования прокси-модели используется следующее: создание прокси для исходной модели. Вы можете создавать, удалять и обновлять экземпляры прокси-модели, и все данные будут сохранены, как если бы вы использовали исходную (не-прокси) модель. Разница в том, что вы можете изменить такие вещи, как порядок модели по умолчанию или менеджер по умолчанию в прокси, без необходимости изменять оригинал.

Подробнее в документации .

2 голосов
/ 31 июля 2017

У вас может быть другая модель, например SiteProfile, которая имеет отношение OneToOne с Site.

0 голосов
/ 22 июня 2019

Начиная с Django 2.2, простого прямого расширения Site до сих пор не существует, как это можно сделать для User. Лучший способ сделать это сейчас - создать новую сущность и поместить туда параметры. Это единственный способ, если вы хотите использовать поддержка существующих сайтов .

class SiteProfile(models.Model):
    title = models.TextField()
    site = models.OneToOneField(Site)

Вам нужно будет создать администратора для SiteProfile. Затем добавьте несколько SiteProfile записей со связью Site. Теперь вы можете использовать site.siteprofile.title в любом месте, где у вас есть доступ к текущему сайту из модели.

...