如何避免Django中类似模型的多个视图重复?

2024-04-20 16:09:14 发布

您现在位置:Python中文网/ 问答频道 /正文

我有一个名为Link的模型,允许用户发送url,还有一些通用视图来处理CRUD操作。你知道吗

然后我决定添加另一个名为Image的模型,它允许用户发送图像。由于链接和图像之间有多个共享字段,我创建了一个新的抽象模型来保留其中的公共字段。你知道吗

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

所以我的问题是:我使用ContentType内置应用程序来处理两个模型的CRUD操作是否正确?如果是的话,我该如何写这些观点?例如,在我显式定义泛型视图要使用的模型时,如果我希望同一个视图为两个不同的模型执行相同的任务,我该如何做?或者在这种情况下使用泛型视图不是一种方法?你知道吗

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

你知道吗型号.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()
    ...

你知道吗视图.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()
    ...

Tags: 方法用户模型图像image视图urlbase
1条回答
网友
1楼 · 发布于 2024-04-20 16:09:14

我觉得你说得再简洁不过了。使用ContentType组合CBV可能只会增加更多开销,ORM需要使用另一个JOIN进行DB查找。你知道吗

但你的视野可能会短一点。您只需要定义queryset或mode,但不能同时定义两者。你知道吗

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

class LinkDetailView(FormMixin, DetailView):
    models      = Link

相关问题 更多 >