2015-11-07 74 views
0

我有一个模型称为链接,它允许用户发送网址。还有一些通用视图可以处理CRUD操作。如何避免在Django中为类似模型重复多个视图?

然后我决定添加另一个名为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

混合/抽象类是不是足以处理常见的东西? – Ivan

+0

@Ivan我不知道你在说什么。你有关于这个的任何文档/教程吗? – sheshkovsky

+0

我正在谈论的只是使用抽象的视图类,你可以把常见的功能。 – Ivan

回答

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