我有一个名为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()
...
答案 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