我正在创建一个博客,我是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
将包含模型名称(Post或Category),slugable_id
是该模型对象的id。
通过这种方式,我想在Slug,Post和Category Model之间建立一个多态关系(就像我在Laravel中一样)。其中Category和Post模型的每个对象都只有一个对应的Slug对象。
现在我想在创建帖子或类别时创建一个slug。但是不知道如何在Django管理中注册这三个模型。
至于有内联管理员必须定义一个外键,这在我的情况下是不可能的。
更新
我想这样做的原因是,对于类别或邮寄来说,不会有任何常见的slu ..例如: 考虑一个有一个slug" unique-slug-1'的帖子。所以不可能有一个slug&class-unique-slug-1'。
答案 0 :(得分:0)
你应该为此设置Generic外键,就我而言,它与Lavarel中的多态关系相同。并且有用于管理面板集成的GenericAdminInline。但实际上它关注的是糟糕的设计,所以最好考虑如何重新设计模型以使用普通的ForeignKey。我建议只创建两个不同的Slug模型,或将slug字段直接移动到Post和Category模型中。此外,您可以使用继承:使用slug字段定义Slug模型并从中继承Post和Category。如果您不需要查询Slug模型,请将abstract = True添加到Slug.Meta