Как мне запросить родительский и дочерний элементы django с помощью отношения «один ко многим»?

#python #django #sqlite #django-views

#python #django #sqlite #django-views

Вопрос:

Итак, я довольно новичок в django, и я пытаюсь создать веб-сайт, который ведет журнал о том, кто последним вывез собак своих семей. Я сделал так, чтобы мои модели включали таблицы для каждого отдельного сообщения, dog и их действий, которые соответствуют самим сообщениям. Я хочу сделать так, чтобы список сообщений был размещен в порядке от последнего к самому раннему сообщению, за которым следуют все действия, которые выполняла каждая собака (т. Е. Если есть два объекта dog, тогда будут два объекта action, которые сопровождают сообщение).

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>
  

Как будет выглядеть идеальный пост:

  • Walker: [generic_user]
  • Пройденное время: [дата и время]
  • Проблемы: [есть проблемы]
  • Dog1: пописал и покакал
  • Dog2: Pooped

Я знаю, как форматировать данные действия, чтобы они выглядели так, как указано выше. Мне просто трудно пытаться объединить объекты action с объектом post. Если что-то из этого сбивает с толку, я прошу прощения. Опубликуйте ниже все, что нуждается в разъяснении. Спасибо!

Ответ №1:

Вы можете получить доступ к обратной стороне a ForeignKey через менеджер, который имеет то же имя, что и related_name=… параметр [Django-doc] . По умолчанию значение равно classname_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 %}  

Комментарии:

1. о, ты был так быстрее 🙂

2. Вау, о боже, это мне так помогло. Вы понятия не имеете, как долго я застрял на этом. Большое вам спасибо за помощь!