访问Django中的相关对象

时间:2010-11-11 20:43:14

标签: django

我有以下型号

class Question(db.Model):
    userid = db.CharField(max_length=50)
    posted = db.DateTimeField(auto_now=True)
    question = db.TextField(max_length=500)
    qid = db.AutoField(primary_key=True)
    title = db.TextField(max_length=80)

class Question_tags(db.Model):
    tag = db.ForeignKey('Tags')
    ques = db.ForeignKey('Question')

class Tags(db.Model):
    tid = db.AutoField(primary_key=True)
    tagname = db.CharField(max_length=30)
    tag_cnt = db.IntegerField()

我需要加入3个模型,即Question,Tags和Question_tags,并获得以下字段问题,标题,标记名和tag_cnt。我尝试使用select_related(),但是我收到的错误就像“queryset不包含对象select_related”...有关如何继续的任何想法吗?

2 个答案:

答案 0 :(得分:2)

  1. 而不是M2M表,您应该使用ManyToManyField;这与您使用Question_tags所做的完全相同,但更方便。
  2. 我不知道你想要什么样的查询(请发一些代码......),但这里有一些例子可以澄清你需要知道的内容:

    Question.objects.get(pk=some_question_id).question_tags_set.all()
    # get all tags of a specific `Question`
    Tags.objects.get(tagname="some_tag").question_tags_set.all()
    # all questions of a specific `Tag`
    
  3. 修改

    要更改ManyToManyField的模型,请使用:

    class Tags(db.Model):
        tid = db.AutoField(primary_key=True)
        tagname = db.CharField(max_length=30)
        tag_cnt = db.IntegerField()
    
    class Question(db.Model):
        userid = db.CharField(max_length=50)
        posted = db.DateTimeField(auto_now=True)
        question = db.TextField(max_length=500)
        qid = db.AutoField(primary_key=True)
        title = db.TextField(max_length=80)
        tags = db.ManyToManyField(Tags)
    

    你可以得到这样的值:

    Question.objects.get(pk=123).tags.all()
    Tags.objects.get(tagname="mytag").question_set.all()
    
    # to count tags for every Question
    from django.db.models import Count
    Question.objects.all().annotate(num_tags=Count("tags"))
    

答案 1 :(得分:0)

我假设您要访问Question_tags对象中的TagsQuestion个对象,这意味着您必须关注foreign key relationship backwards

question = Question.objects.get(pk=1)
question_tags = question.question_tags_set.all()

如果您不想通过FOO_set访问对象,可以在模型中的字段上设置related_name

class Question_tags(db.Model):
    tag = db.ForeignKey('Tags', related_name="my_tag_objects")
    ques = db.ForeignKey('Question')

然而,如果你的模型是这样的,我认为你的Question_tags模型是多余的,可以用Question中的ManyToManyField代替。