【问题标题】:Generalized Model in DjangoDjango中的广义模型
【发布时间】:2011-05-21 08:16:38
【问题描述】:

我的第一个问题对我帮助很大,所以我想我会继续问第二个问题。

我目前的(实践)项目是创建一个通用模型。以下是我目前所写的:

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

想法?

【问题讨论】:

    标签: python django django-models django-views logic


    【解决方案1】:

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

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

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

    【讨论】:

    • 我暂时不会接受答案,直到我能够真正处理您在这里给我的内容。但我不得不说:谢谢!我真的没有想过以这种方式实现它,但我可以看到它会有多大用处! :D
    • 老兄,我终于明白了这一点,我不得不说:可靠。我刚刚想出了如何将其整合到我正在从事的另一个项目中!
    猜你喜欢
    • 1970-01-01
    • 2018-02-03
    • 1970-01-01
    • 2015-07-29
    • 1970-01-01
    • 2018-05-15
    • 1970-01-01
    • 2014-08-15
    • 1970-01-01
    相关资源
    最近更新 更多