代码之家  ›  专栏  ›  技术社区  ›  Michael Ninh

添加更多与外键的关联

  •  1
  • Michael Ninh  · 技术社区  · 8 年前

    我有两种型号: Question UserEdus

    用户EDUS 可以投票 .

    投票后, 问题 存储关联的 投票结果。我不知道如何创建和增加这个协会。

    正在说 问题 可以有很多 思考这个问题的正确方法是什么?

    这就是我目前所拥有的。

    class Question(models.Model):
    title = models.CharField(max_length=500, null=False)
    content = models.TextField(max_length=10000, null=False)
    author = models.ForeignKey('UserEdus', null=False)
    solution_found = models.BooleanField(default=False, null=False)
    points = models.IntegerField(default=1, null=False)
    post_date = models.DateField(default=date.today)
    
    class UserEdus(models.Model):
    user = models.OneToOneField(User, on_delete=models.SET_NULL, null=True)
    bio = models.TextField(max_length=400, help_text="Enter your bio details here.")
    votes = models.ForeignKey(Question, null=True)
    

    def upvote(request,pk):
    question = get_object_or_404(Question, pk=pk)
    question.points += 1
    request.user.useredus.votes_set.add(question)
    question.save()
    

    这将返回错误 'UserEdus' object has no attribute 'votes_set'

    2 回复  |  直到 8 年前
        1
  •  1
  •   Chris Jones    8 年前

    我认为您需要的是相关的_name参数和一个ManyToManyField模型字段。我会改变:

    votes = models.ForeignKey(Question, null=True)
    

    收件人:

    votes = models.ManyToManyField("Question", related_name="votes")
    

    这样,您可以执行如下查询:

    somevar = Question.objects.get(pk=1)
    all_votes = somevar.votes.all()
    

    您的代码如下所示:

    class Question(models.Model):
        title = models.CharField(max_length=500, null=False)
        content = models.TextField(max_length=10000, null=False)
        author = models.ForeignKey('UserEdus', null=False)
        solution_found = models.BooleanField(default=False, null=False)
        points = models.IntegerField(default=1, null=False)
        post_date = models.DateField(default=date.today)
    
    class UserEdus(models.Model):
        user = models.OneToOneField(User, on_delete=models.SET_NULL, null=True)
        bio = models.TextField(max_length=400, help_text="Enter your bio details here.")
        votes = models.ManyToManyField(Question, related_name="votes")
    

    您的upvoteview看起来像:

    def upvote(request,pk):
        question = get_object_or_404(Question, pk=pk)
        question.points += 1
        question.save()
        useredus = UserEdus.objects.get(user__username=request.user.username)
        useredus.votes.add(question)
        useredus.save()
    

    我希望这有帮助!

        2
  •  1
  •   Mauricio Cortazar    8 年前
    request.user.useredus.votes = question