Админ встроенный без внешнего ключа - PullRequest
0 голосов
/ 29 апреля 2018

Я создаю блог, и я новичок в Django. У меня есть три модели Slug, Post, Category.

class Slug(models.Model):
    slugable_type = models.CharField(max_length=32)
    slugable_id = models.IntegerField()
    slug = models.CharField(max_length=127)


class Category(models.Model):
    name = models.CharField(max_length=255)
    updated = models.DateTimeField(auto_now=True, auto_now_add=False)
    timestamp = models.DateTimeField(auto_now=False, auto_now_add=True)
    parent = models.ForeignKey('Category', on_delete=models.CASCADE)

    def __str__(self):
        return self.title


class Post(models.Model):
    category = models.ForeignKey(Category, on_delete=models.CASCADE)
    title = models.CharField(max_length=255)
    content = models.TextField()
    updated = models.DateTimeField(auto_now=True, auto_now_add=False)
    timestamp = models.DateTimeField(auto_now=False, auto_now_add=True)

    def __str__(self):
        return self.title

Now В Slug модель slugable_type будет содержать название модели (сообщение или категория), а slugable_id - идентификатор этого объекта модели. Таким образом, я хочу установить полиморфную связь (как я это делаю в Laravel) между Slug, Post и Model Model. Где каждый объект модели категории и поста будет иметь ровно один соответствующий объект слага.

Теперь я хочу создать слаг при создании поста или категории. Но не знаю, как зарегистрировать эти три модели в администрации Джанго.

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

Обновлено

Причина, по которой я хочу это сделать, заключается в том, что не будет никакого общего слага для категории или сообщения. Например: рассмотрим пост, в котором есть слаг «unique-slug-1». Так что не может быть категории с слагом 'unique-slug-1'.

1 Ответ

0 голосов
/ 29 апреля 2018

Для этой цели вы должны настроить общий внешний ключ, это то же самое, что полиморфное отношение в Lavarel, насколько мне известно. И есть GenericAdminInline для интеграции админ-панели. Но на самом деле это касается плохого дизайна, поэтому лучше подумайте, как вы можете изменить дизайн своих моделей, чтобы использовать обычный ForeignKey. Я бы предложил создать две разные модели слагов или переместить поле слагов непосредственно в модель поста и категории. Также вы можете использовать наследование: определите модель Slug с полем slug и унаследуйте от него Post и Category. Если вам не нужно запрашивать модель Slug, добавьте abstract = True к Slug.Meta

...