繁体   English   中英

如何在Django中联接表?

[英]How to join tables in Django?

下面是我的models.py

class Topic(models.Model):
    name = models.CharField(max_length=30, unique=True)
    description = models.CharField(max_length=300)
    created_on = models.DateTimeField(auto_now_add=True)
    created_by = models.ForeignKey(User, related_name='topic')
    def __str__(self):
        return self.name

class Question(models.Model):
    name = models.CharField(max_length=300, unique=True)
    img = models.CharField(max_length=100)
    topic = models.ForeignKey(Topic, related_name='question')
    created_by = models.ForeignKey(User, related_name='question')
    created_on = models.DateTimeField(auto_now_add=True)
    def __str__(self):
        return self.name

class Answer(models.Model):
    ans = models.TextField()
    img = models.CharField(max_length=100)
    created_by = models.ForeignKey(User, related_name='answer')
    created_on = models.DateTimeField(auto_now_add=True)
    ques = models.ForeignKey(Question, related_name='answer')
    def __str__(self):
        return self.ans

class Upvote(models.Model):
    upvote = models.BooleanField(default=False)
    upvote_by = models.ForeignKey(User, related_name='upvote')
    upvoted_on = models.DateTimeField(auto_now_add=True)
    ques = models.ForeignKey(Question, related_name='upvote')
    ans = models.ForeignKey(Answer, related_name='upvote')

class Comment(models.Model):
    comment = models.TextField()
    comment_by = models.ForeignKey(User, related_name='comment')
    commented_on = models.DateTimeField(auto_now_add=True)
    ques = models.ForeignKey(Question, related_name='comment')
    ans = models.ForeignKey(Answer, related_name='comment')

class Follow(models.Model):
    topic = models.ForeignKey(Topic, related_name='follow')
    user = models.ForeignKey(User, related_name='follow')

我正在尝试根据具有用户主题映射的下表获取问题和答案。

  • user_topic =从下表获取用户主题
  • 问题=在主题= user_topic的地方提问
  • 答案=在问题=问题的地方回答

以下是我的views.py

def home(req):
    user_id = req.user.id
    follow = Follow.objects.filter(user = user_id).all()
    user_follow_topics = Topic.objects.filter(pk__in=follow).all()
    question = Question.objects.filter(topic__in=user_follow_topics).all()
    answer = Answer.objects.filter(ques__in=question).all()
    topic = Topic.objects.all()
    return render(req,'home.html',{'topic':topic,'user_follow_topic':user_follow_topics,'question':question,'answer':answer})

以下是我的home.html

<div class="container" id="cont">
        <div id="topicDiv" class="row">
            <input type="hidden" value="{%csrf_token%}" id="hid_csrf"/>
            {% for t in topic %}
            <h4 id="{{t.pk}}" class="topCls"><span class="badge badge-Info">{{t.name}}</span></h4>
            &nbsp;
            {% endfor %}
        </div>
    <br />
        <div class="" id="">
            {% for ans in answer %}
            <div id="feed">
                <div id="">
                    <h5><span class="">{{ans.ques.name}}</span></h5>
                </div>
                <div class="">
                    <h6><span class="">{{ans.ans}}</span></h6>
                </div>
            </div>
            <br />
            {% endfor %}
        </div>
</div>

也许我丢了东西)

PS:最好在复数中使用related_name参数。

from django.db.models import Prefetch, Count

Question.objects.filter(
    topic__follow__user=request.user
).select_related(
    'topic', 'created_by'
).prefetch_relaed(
    Prefetch(
        'answer',
        queryset=Answer.objects.select_related('created_by').annotate(
            upvotes_count=Count('upvote')
        ).prefetch_related(
            Prefetch(
                'comment',
                queryset=Comment.objects.select_related('comment_by')
            )
        )
    ),
    Prefetch(
        'comment',
        queryset=Comment.objects.select_related('comment_by')
    ),
).annotate(
    upvotes_count=Count('upvote')
)

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM