2017-03-05 88 views
0

我正在学习Django,并试图创建一个简单的问题回答应用程序,其中用户也可以喜欢的问题和/或答案。现在我要做的就是跟踪谁喜欢的特定问题/答案,所以我创建了一个单独的模型来跟踪这个如下:Python的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正在重复......是正确的方法,还是我可以做得更好?

+0

不要称他们为“answer_id”,而只是“回答”。 Django将在幕后自动添加“_id”部分。另外,不要把它叫做“likes_by”,而是把“user”和相关的名字叫做“likes”,这样你可以做'user.likes.all()'等等。对于'answer'和'question'也是一样的。最后,模型应该总是使用单数,所以'class Vote(models.Model)'而不是“Votes”。 – C14L

+0

感谢提示@ C14L,我会照顾到这一点。我使用了question_id,因为我正在使用django rest框架序列化程序,并且我想将它作为JSON中的键发送给客户端。即{{question_id}:}。当我使用问题时,它被发送为{“question”:},这是令人困惑的。序列化程序中的键与字段名有什么不同? –

+0

是的,有,您应该为DRF中的REST API字段进行“命名”,而不是在数据库级别。 – C14L

回答

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() 
+0

非常感谢@L Green。这绝对是一个更好的方法! –

-1

这不是一个python,django的问题,它适合一个RDBMS设计问题。

但是,为了回答你的问题,

如果你想从用户投票检查重复那么它是正确的做法。

其他方法是将投票帖ID更新到用户表。这当然是不好的方法。

+0

谢谢@sayingu !! –