【问题标题】:Adding more associations with foreign key添加更多与外键的关联
【发布时间】:2017-12-21 10:22:40
【问题描述】:

我有两个模型:QuestionUserEdus

UserEdus 可以对Question 投票。

投票后,Question 存储已投票的关联 UserEdus 列表。我不确定如何创建和添加此关联。

是说Question可以有很多UserEdus思考这个问题的正确方法吗?

这是我目前所拥有的。

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)

点击upvote按钮后,此视图被调用,

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'

我做错了什么?文档遵循这种模式。

【问题讨论】:

    标签: django python-3.x django-models foreign-keys


    【解决方案1】:

    我认为您正在寻找的是 related_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")
    

    您的赞成意见如下所示:

    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】:
      request.user.useredus.votes = question 
      

      这是正确的方法

      【讨论】:

      • 我不明白。 UserEdus 是一个类,外键是类 Question?
      • 没有用。引号是为尚未定义的类设置外键。
      • request.user.Question.votes_set.add('a') 用这个替换并告诉我发生了什么
      • “用户”对象没有“问题”属性。
      • request.user.useredus.votes = question, 那是确定的
      猜你喜欢
      • 2014-08-29
      • 2012-11-24
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多