Django 的标签系统
Tag system for Django
我正在构建一个测验应用程序,用户(内容创建者或作者)可以从特定域创建测验(基于选择的问题及其解决方案)。其他用户(消费者 - 尚未实施)可以尝试这些测验。
为了让测验消费者能够根据他们感兴趣的特定领域搜索问题(并增加测验内容的粒度),我正在实施附加到问题的标签系统。
这是我的模型:
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 系统会更好吗?
在我看来我建议你尝试这两个项目
django-tagging。
django-taggit.
这已经完全与 ManyToManyField 相同。唯一的区别是添加该字段将为您提供从问题到标记的显式访问器。
(请注意,您的模型非常奇怪。在每个字段名称前加上模型名称的缩写版本绝对没有任何好处;无论如何您只能通过模型访问该字段,因此您将永远是做 question.ques_text
,这是多余的。除非你有充分的理由,否则你不应该定义自己的 PK 字段。)
我正在构建一个测验应用程序,用户(内容创建者或作者)可以从特定域创建测验(基于选择的问题及其解决方案)。其他用户(消费者 - 尚未实施)可以尝试这些测验。
为了让测验消费者能够根据他们感兴趣的特定领域搜索问题(并增加测验内容的粒度),我正在实施附加到问题的标签系统。
这是我的模型:
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 系统会更好吗?
在我看来我建议你尝试这两个项目 django-tagging。 django-taggit.
这已经完全与 ManyToManyField 相同。唯一的区别是添加该字段将为您提供从问题到标记的显式访问器。
(请注意,您的模型非常奇怪。在每个字段名称前加上模型名称的缩写版本绝对没有任何好处;无论如何您只能通过模型访问该字段,因此您将永远是做 question.ques_text
,这是多余的。除非你有充分的理由,否则你不应该定义自己的 PK 字段。)