Django中的通用模型
我第一次提问得到了很多帮助,所以我决定再问一个。
我现在的练习项目是创建一个通用模型。到目前为止,我写了这些:
from django.db import models
from django.contrib.auth.models import User
# Create your models here.
class Block(models.Model):
title = models.CharField(man_length=50)
#Make sure child classes have content defined!
#content = models.BooleanField(default=False)
owner = models.ForeignKey('User')
access = models.ManytoManyField('User', null=True)
links = models.ManytoManyField('self', null=True)
class Meta:
abstract = True
def __unicode__(self):
return self.title
class Text(Block)
content = models.TextField(max_length=100)
class URL(Block)
content = models.URLField()
class Email(Block)
content = models.EmailField()
请注意,我还没有实际测试过这些代码——我觉得目前的逻辑可能行不通。
我有几个目标:
1) owner指的是这个块的创建者。我觉得这个应该没问题。
2) access应该指向可以编辑这个块的用户(除了创建者)。我觉得这个也应该可以实现。(当然需要适当的视图)
3) links应该允许块之间的链接——这样我可以获取一个块以及任何相关的块(如果需要的话可以一直往上查)
4) content当然是这个块的内容(我这里有三个简单的数据类型作为示例),理想情况下可以是任何数量的东西(通过抽象基类来实现)。
5) 对于Email、URL和Text这三个类,我希望能写一个(通用的)视图,从一个URL输入中返回适合的任意类型的块。我觉得这可能需要一个自增字段,以确保这三个模型之间有唯一的值。老实说,我完全不知道该怎么做。
6) 理想情况下,这个模型应该是容易扩展的,如果可能的话。
我当然不太确定这样做是否是实现我想要的目标的最佳方法。欢迎任何建议、帮助、技巧、窍门,或者糟糕的笑话!
非常感谢你的帮助!
编辑:关于第5点,我有一个粗略的视图(有语法错误),我觉得可能可以解决这个问题:
def getblock(request, block, no):
data = get_object_or_404(%s,%s) % (block,no)
return render_to_response('single.html',{'data':data})
有什么想法吗?
1 个回答
3
我觉得你的代码看起来没问题。我在我的项目中也做过一个通用类,和这个很相似。有一点建议,当你获取一个块的时候,应该做一些类型检查,以便获取类的数据。所以我建议你加一个字段来存储它的类型,比如:
class Block(models.Model):
title = models.CharField(max_length=50)
type = models.IntegerField()# 1 for text, 2 for email and 3 for url
#Make sure child classes have content defined!
#content = models.BooleanField(default=False)
owner = models.ForeignKey('User')
access = models.ManytoManyField('User', null=True)
links = models.ManytoManyField('self', null=True)
然后在你的视图中:
def getblock(request, block, no):
if block.type == 1:
data = get_object_or_404(Block,id=no).text
elif block.type == 2:
data = get_object_or_404(Block,id=no).email
elif block.type == 3:
data = get_object_or_404(Block,id=no).url
return render_to_response('single.html',{'data':data})
你可以用小写的方式来访问那个子类。我觉得这样会很好用。另外,我不太明白你写的字典类型的参数,这在我执行的时候出现了语法错误。无论如何,我也修正了一些语法错误。