2015-04-22 2 views
1

Я создаю приложение Quiz, где пользователь (создатель контента или автор) может создавать викторины (вопросы на основе выбора и их решения) из определенного домена. Эти опросы могут быть предприняты другими пользователями (потребители - еще не реализованы).Система тегов для 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 для тегов. Может ли кто-нибудь просветить, было бы лучше использовать поле ManyToMany, встроенное в Django, или реализовать систему 3NF как выполненную?

ответ

1

Это уже точно такое же, как у ManyToManyField. Единственное отличие состоит в том, что добавление поля даст вам явный аксессуар от вопроса к тегу.

(Обратите внимание, что ваши модели очень странные. Нет никакой выгоды при префиксах каждого имени поля с сокращенной версией имени модели, вы можете только когда-либо получить доступ к полю через модель, так что вы всегда будете делать question.ques_text, который является избыточным. И вы не должны определять свои собственные поля PK, если у вас нет веских оснований.)

+0

Я хочу иметь дескриптор на тегах, а метод, который я реализовал, дает мне этот дескриптор - I предположим, это то, что вы подразумеваете под «явным доступом» (извините, мои языковые навыки очень плохие). Большое спасибо за проверку моделей. Это мой первый проект в Django такого рода, и я делаю много таких ошибок. Я сделаю соответствующие изменения, чтобы отразить эти предложения. Благодарю. – solyarist

Смежные вопросы