【问题标题】:How do I query django parent and child by a one to many relationship?如何通过一对多关系查询 django 父母和孩子?
【发布时间】:2021-02-22 21:22:29
【问题描述】:

所以我对 django 还很陌生,我正在尝试创建一个网站来记录谁最后带走了他们家人的狗。我已经制作了我的模型以包含每个单独的帖子、狗及其与帖子本身相对应的动作的表格。我想这样做,以便按照最新到最早的帖子的顺序放置帖子列表,然后是每只狗所做的所有动作(即,如果有两个狗对象,那么帖子将有两个动作对象)。

models.py:

from django.db import models
from django.utils import timezone
from django.contrib.auth.models import User

class Dog(models.Model):
    name = models.CharField(max_length = 20)

class Post(models.Model):
    walker = models.ForeignKey(User, on_delete = models.CASCADE)
    time_posted = models.DateTimeField(default = timezone.now)
    issues = models.TextField(max_length = 300)

class Action(models.Model):
    post = models.ForeignKey(Post, on_delete = models.CASCADE)
    dog = models.ForeignKey(Dog, on_delete = models.CASCADE)
    peed = models.BooleanField(default = False)
    pooped = models.BooleanField(default = False)

views.py:

from django.shortcuts import render
from django.views.generic import ListView, CreateView
from .models import Post, Dog, Action
from django.http import HttpResponse

class ActionList(ListView):

def home(request):
    context = {
        'posts': Post.objects.all(),
        'actions': Action.objects.all(),
        'dogs': Dog.objects.all()
    }
    return render(request, 'dog_log_app/home.html', context)

main.html:

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Home</title>
</head>
<body>
    <div>
        <h1>Home</h1>
        <!-- displays user info -->
        {% if user.is_authenticated %}
        <h2>Current Logged in User is {{request.user.username}}</h2>
        <a href = "{% url 'logout' %}">Logout</a>
        {% else %}
            <a href = "{% url 'login' %}">Login</a>
            <a href = "{% url 'register' %}">Register</a>
        {% endif %}
        <br>
        <h2>Posts:</h2>
        {% for post in posts %}
            <h3>person walking: {{post.walker}}</h3>
            <h4>time walked: {{post.time_posted}}</h4>
            <h4>issues: {{post.issues}}</h4>
            {% for action in actions %}
                {{ACTIONS CORRESPONDING TO POST}}
            {% endfor %}
            
        {% endfor %}
    </div>
</body>
</html>

理想的帖子应该是什么样子:

  • 沃克:[generic_user]
  • 走过的时间:[日期和时间]
  • 问题:[任何问题]
  • 狗 1:撒尿和拉屎
  • Dog2:拉屎

我知道如何格式化操作数据,使其看起来像上面的样子。我只是很难尝试将动作对象与 post 对象结合起来。 如果其中任何一个令人困惑,我深表歉意。在下面发布任何需要澄清的内容。谢谢!

【问题讨论】:

    标签: python django sqlite django-views


    【解决方案1】:

    您可以通过与related_name=… parameter [Django-doc] 同名的经理访问ForeignKey 的反面。默认值为<i>classname</i>_set。因此,在这种情况下,您可以通过以下方式获取项目:

    {% for action in post.action_set.all %}
        …
    {% endfor %}

    因此你可以这样写:

    {% for action in post.action_set.all %}
        {{ action.dog.name }}: {% if action.peed %}peed{% endif %} {% if action.pooped %}pooped{% endif %}
    {% endfor %}

    【讨论】:

    • 哦,你太快了 :)
    • 哇哦,天哪,这对我帮助很大。你不知道我在这件事上被困了多久。非常感谢您的帮助!
    猜你喜欢
    • 2016-05-13
    • 2020-06-21
    • 2018-02-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-09-22
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多