2015-04-22 79 views
1

我正在構建一個測驗應用程序,用戶(內容創建者或作者)可以從特定域創建測驗(基於選擇的問題及其解決方案)。這些測驗可以由其他用戶嘗試(消費者 - 尚未實施)。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系統會更好嗎?

回答

1

這已經是正好與ManyToManyField相同。唯一的區別是添加字段會給你一個顯式的從問題到標籤的訪問器。 (請注意,您的模型非常奇怪,在每個字段名稱前加上縮寫的模型名稱是絕對沒有好處的;您只能通過模型​​訪問字段,所以您總是會這樣做question.ques_text,這是多餘的。你不應該定義你自己的PK領域,除非你有很好的理由。)

+0

我想要一個標籤的句柄,而且我實現的方法給了我那個句柄 - 我猜猜這就是你的意思是「顯式訪問者」(我很抱歉,我的語言技能非常差)。 非常感謝您檢查模型。這是我在Django的第一個這樣的項目,我犯了很多這樣的錯誤。我會做出適當的修改以反映這些建議。謝謝。 – solyarist