Django中的通用模型

3 投票
1 回答
861 浏览
提问于 2025-04-16 18:04

我第一次提问得到了很多帮助,所以我决定再问一个。

我现在的练习项目是创建一个通用模型。到目前为止,我写了这些:

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

你可以用小写的方式来访问那个子类。我觉得这样会很好用。另外,我不太明白你写的字典类型的参数,这在我执行的时候出现了语法错误。无论如何,我也修正了一些语法错误。

撰写回答