【问题标题】:How to avoid duplicating multiple views for similar models in Django?如何避免在 Django 中为类似模型重复多个视图?
【发布时间】:2016-02-08 16:20:33
【问题描述】:

我有一个名为 Link 的模型,它允许用户发送 url。并且有一些通用视图来处理 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()
    ...

【问题讨论】:

  • 混入/抽象类还不足以处理常见的东西吗?
  • @Ivan 我不知道你在说什么。你有这方面的文档/教程吗?
  • 我说的是使用抽象视图集类,您可以在其中放置常用功能。

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


【解决方案1】:

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

但您的视图可能会短一些。您只需要定义查询集或模式,而不需要同时定义两者。

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

class LinkDetailView(FormMixin, DetailView):
    models      = Link

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-03-04
    • 1970-01-01
    • 1970-01-01
    • 2023-03-09
    • 1970-01-01
    • 1970-01-01
    • 2014-07-06
    • 1970-01-01
    相关资源
    最近更新 更多