Python Django模型基础知识

时间:2017-03-05 08:59:49

标签: python django

我正在学习django并试图创建一个简单的问答应用程序,用户也可以在这里找到问题和/或答案。现在我想做的是跟踪谁喜欢某个特定的问题/答案,所以我创建了一个单独的模型来跟踪它如下:

class Votes(models.Model):
    answer_id = models.ForeignKey(Answers, related_name='likes_answers', null=True, default=None, db_column='answer_id')
    question_id = models.ForeignKey(Questions, related_name='likes_questions', null=True, default=None, db_column='question_id')
    likes_count = models.IntegerField(blank=True, default=0)
    liked_by = models.ForeignKey(User, related_name='like_user', null=True, default=None, on_delete=models.CASCADE)

现在这种方法的问题在于,每当有人想要问题或答案时,都会有一个这个模型的条目,它会为不同的用户创建相同的question_id或answer_id的多个条目。虽然用户不同,但是很多answer_ids和question_ids都在重复......这是正确的方法还是我可以做得更好?

2 个答案:

答案 0 :(得分:1)

我想更好的方法是使用多对多字段:用户可以喜欢多个问题/答案,并且多个用户可能会喜欢问题/答案。

假设您的答案有特定问题的外键,模型可能如下所示:

class Question(models.Model):
    # .. other attributes
    liked_by = models.ManyToManyField(User, related_name = 'liked_question')

class Answer(models.Model):
    question = models.ForeignKey(Question)
    # .. other attributes
    liked_by = models.ManyToManyField(User, related_name = 'liked_answer')

要获得所有喜欢该答案的用户,请使用

 answer_object.liked_by.all()

对于(经常使用的)喜欢计数,你只需使用

answer_object.liked_by.count()

多对多字段也是相反的,所以要确定用户的喜欢,你可以使用(感谢相关名称)

user_object.liked_question_set.all()

user_object.liked_answer_set.all()

答案 1 :(得分:-1)

It's not a python, django question, it's fit an RDBMS design question.

But to answer your question,

If you want to check the duplicate from voting by user then it's right approach.

Other approach is update the voting post id to the user table. It's of course bad approach.