Django的标签系统

时间:2015-04-22 18:54:05

标签: django django-models tags tagging 3nf

我正在构建一个Quiz应用程序,用户(内容创建者或作者)可以从特定域创建测验(基于选择的问题及其解决方案)。其他用户可以尝试这些测验(消费者 - 尚未实施)。

为了让测验消费者能够根据他们感兴趣的特定域搜索问题(并为测验内容添加粒度),我正在实施一个附加到问题的标记系统。

以下是我的模特:

class question(models.Model):   

    ques_id = models.AutoField(primary_key=True) 
    ques_text = models.TextField(max_length=1024, blank=False)
    ques_author = models.ForeignKey('author')
    ques_created = models.DateField(auto_now_add=True)
    ques_dscore = models.IntegerField()
    ques_bloom = models.CharField(max_length=3)
    ques_subject = models.CharField(max_length=3)
    ques_type = models.CharField(max_length=1)
    ques_flags = models.CharField(max_length=16)
    ques_quiz = models.ManyToManyField('quiz')

    def __unicode__(self):
        return self.ques_text

class choice(models.Model):

    choice_id = models.AutoField(primary_key=True)
    choice_text = models.CharField(max_length=256, blank=False)
    choice_ques = models.ForeignKey('question')
    choice_ans = models.BooleanField(default=False)
    choice_tags = models.CharField(max_length=32)

    def __unicode__(self):
        return self.choice_text

class answer(models.Model):

    answer_id = models.AutoField(primary_key=True)
    answer_text = models.TextField(max_length=1024)
    answer_ques = models.ForeignKey('question')
    answer_choice = models.ForeignKey('choice')
    answer_tags = models.CharField(max_length=128)

class author(models.Model):

    user = models.OneToOneField(User)
    domain = models.CharField(max_length=16)

    def __unicode__(self):
        return self.user.username


# a table for storing all the tags
class tags(models.Model):

    tags_id = models.AutoField(primary_key=True)
    tags_text = models.CharField(max_length=16)

    def __unicode__(self):
        return self.tags_text

# table that connects tags with question attached to the tag
# from all the research on the web, it can be infered that
# 3NF tagging (Toxi Solution) is the best way to go
# good for inserts but slow on selects
class tagcon(models.Model):

    tagcon_id = models.AutoField(primary_key=True)
    tagcon_tags = models.ForeignKey('tags')
    tagcon_ques = models.ForeignKey('question')

我目前已应用3NF标记Toxi解决方案。问题是非规范化系统有助于更快的选择,3NF会更快插入但搜索速度慢。

如果我应该将ManyToMany字段类型用于标记,我感到很困惑。如果在Django中使用内置的ManyToMany字段或者实现3NF系统会更好吗?

2 个答案:

答案 0 :(得分:3)

这已经完全与ManyToManyField相同。唯一的区别是添加字段会为您提供从问题到标记的显式访问者。

(注意,你的模型非常奇怪。在每个字段名称前加上模型名称的缩写版本绝对没有任何好处;你只能通过模型​​访问该字段,所以你总是会这样做{ {1}},这是多余的。除非你有充分的理由,否则你不应该定义自己的PK字段。)

答案 1 :(得分:2)

在我看来,我建议你尝试这两个项目 django-taggingdjango-taggit