Доступ к связанным объектам в Джанго - PullRequest
0 голосов
/ 11 ноября 2010

У меня есть модель ниже

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 моделям, а именно Вопросу, Тегам и Вопросительным тегам, и получить следующие поля: вопрос, заголовок, тэг и тег_cnt.Я попытался с select_related (), но я получаю сообщение об ошибке типа "queryset не содержит объект select_related" ... Любая идея о том, как продолжить ??

Ответы [ 2 ]

2 голосов
/ 12 ноября 2010
  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`
    

РЕДАКТИРОВАТЬ :

Чтобы изменить свои модели для 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"))
0 голосов
/ 12 ноября 2010

Я предполагаю, что вы хотите получить доступ к объектам Question_tags и Tags из объекта Question, что означает, что вы следуете за отношением внешнего ключа в обратном направлении .

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 модель является избыточной и может быть заменена на ManyToManyField в Question.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...