Django中的广义模型:请帮助我理解我的逻辑!

时间:2011-05-21 08:16:39

标签: django django-models logic django-views

我的第一个问题帮了我很多,所以我想我会继续问第二个问题。

我目前的(实践)项目是创建一个通用模型。这是我到目前为止所写的内容:

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)所有者指向该区块的创建者。我认为这应该有效。

2)访问应该指向可以编辑块的用户(所有者除外)。我认为这也应该有效。 (当然有适当的观点)

3)链接应该允许块之间的链接 - 所以我可以检索一个块和任何相关的块(如果需要的话,依此类推)

4)内容当然应该是块的内容(我这里有三个示例简单数据类型),理想情况下可以是任意数量的东西(通过抽象基类在这里实现)。

5)对于电子邮件,URL和文本类,我希望能够编写一个(通用的)视图,它从一个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 个答案:

答案 0 :(得分:2)

您的代码对我来说似乎是正确的。我还为我的项目开发了一个泛型类,它与此类似。一句话,当你得到一个块时,你应该做一些类型检查来检索类数据,所以,我建议你添加一个字段来存储它的类型。 e.g:

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})

您可以使用该子类的小写表示来访问子类。我认为这将很好地工作。另外,我没有得到您编写的字典类型参数,并且在执行时出现语法错误。无论如何,我也纠正了一些语法错误。