如何避免在Django中为类似模型复制多个视图?

时间:2015-11-07 16:38:28

标签: python django django-generic-views django-contenttypes

我有一个名为Link的模型,允许用户发送网址。并且有一些通用视图来处理CRUD操作。

然后我决定添加另一个名为Image的模型,允许用户发送图像。由于Link和Image之间存在多个共享字段,因此我创建了新的抽象模型以保留其中的公共字段。

现在我应该为Image模型添加视图。天真的选项似乎是复制Link的所有通用视图,并用Image替换模型字段。但我想可能有一种更有效的方法(比如抽象模型,以避免重复共享字段)。我不确定,但是使用ContentType模块会有帮助吗?

所以我的问题是:我是否正确使用ContentType内置应用程序处理两个模型的CRUD操作才能高效?如果是这样,我将如何撰写观点?例如,目前我明确定义了通用视图使用的模型,当我希望相同的视图为两个不同的模型执行相同的任务时,我该怎么做?或者也许在这种情况下使用通用视图不是要走的路?

我添加了部分代码,所以如果有人通过一些简短的代码提示回答这些问题,可以使用它们:

models.py

class Base(models.Model):
    title       = models.CharField(max_length=200)
    slug        = models.CharField(max_length=200, db_index=True)
    category    = models.ForeignKey(Category, default=1)
    . . . 
    class Meta:
        abstract = True
class Link(Base):
    url         = models.URLField("URL")
    description = models.TextField(max_length=500)
    ...
class Image(Base):
    image       = models.ImageField()
    ...

views.py

class LinkListView(ListView):
    model = Link
    queryset    = Link.objects.all().order_by('-rank_score')
    paginate_by = 10

class LinkDetailView(FormMixin, DetailView):
    models      = Link
    queryset    = Link.objects.all()
    ...

1 个答案:

答案 0 :(得分:0)

我认为你不能更加简洁。使用ContentType组合CBV可能只会增加更多开销,而ORM则需要使用另一个JOIN进行数据库查找。

但你的观点可能会短一点。您只需要定义查询集或模式,但不能同时定义两者。

class LinkListView(ListView):
    queryset    = Link.objects.all().order_by('-rank_score')
    paginate_by = 10

class LinkDetailView(FormMixin, DetailView):
    models      = Link