【问题标题】:Admin inline without foreign key没有外键的管理员内联
【发布时间】:2018-10-09 20:52:24
【问题描述】:

我正在创建一个博客,我是 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

现在在 Slug 中,模型 slugable_type 将包含模型名称(帖子或类别),slugable_id 是该模型对象的 ID。 通过这种方式,我想在 Slug、Post 和 Category Model 之间建立一个多态关系(就像我在 Laravel 中所做的那样)。 Category 和 Post 模型的每个对象都将有一个对应的 Slug 对象。

现在我想在创建帖子或类别时创建一个 slug。但是不知道如何在Django管理中注册这三个模型。

要让管理员内联,必须定义一个外键,这在我的情况下是不可能的。

更新

我想这样做的原因是类别或帖子不会有任何常见的slug。例如: 考虑一个有 slug 'unique-slug-1' 的帖子。所以不能有一个带有 slug 'unique-slug-1' 的类别。

【问题讨论】:

    标签: django django-models django-admin


    【解决方案1】:

    您应该为此设置通用外键,就我而言,它与 Lavarel 中的多态关系相同。还有用于管理面板集成的 GenericAdminInline。但实际上它被认为是糟糕的设计,所以最好考虑如何重新设计模型以使用普通的 ForeignKey。我建议只创建两个不同的 Slug 模型,或者将 slug 字段直接移动到 Post 和 Category 模型中。此外,您可以使用继承:使用 slug 字段定义 Slug 模型并从中继承 Post 和 Category。如果不需要查询 Slug 模型,在 Slug.Meta 中添加 abstract=True

    【讨论】:

      猜你喜欢
      • 2017-11-22
      • 1970-01-01
      • 2013-03-01
      • 2010-12-21
      • 2011-08-10
      • 1970-01-01
      • 2011-07-25
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多