Python/Django复杂/嵌套查询

2024-04-18 01:00:25 发布

您现在位置:Python中文网/ 问答频道 /正文

我是python和Django的初学者,正在做我的第一个项目。我一步一步地克服了几乎所有遇到的困难,但有一个问题使我陷入困境,我不知道如何解决它。
目标是显示当前在特定游乐场的每个用户的子级。它应该是这样的:我有一个特定用户的“当前访问”,我想显示他/她的孩子/孩子。我不想选择哪个孩子和他/她的父母在操场上,在这个阶段,我假设所有可能的孩子都和他/她的父母在一起:)

以下是我的模型:

    class Quarter(models.Model):
    name = models.CharField(max_length=64, choices=QUARTER, default='not defined')

class Pground(models.Model):
    place = models.CharField(max_length=128)
    description = models.TextField()
    quarter = models.ForeignKey(Quarter)

class Child(models.Model):
    name = models.CharField(max_length=128)
    age = models.IntegerField(choices=AGE, default=-1)
    sex = models.IntegerField(choices=SEX, default=1)
    whose_child = models.ForeignKey(User)


class Parent(models.Model):
    user = models.OneToOneField(User)
    quarter = models.ForeignKey(Quarter)
    children = models.ManyToManyField(Child)   


class Visit(models.Model):
    who = models.ForeignKey(User)
    pground = models.ForeignKey(Pground)
    time_from = models.DateTimeField()
    time_to = models.DateTimeField()

到目前为止,相关观点是这样的:

        class HomeLogView(LoginRequiredMixin, View):
    login_url = '/login/'
    def get(self, request):
        user = request.user
        quarter = user.parent.quarter
        pgrounds = quarter.pground_set.all()
        current_visits = {}
        for pground in pgrounds:
            now = datetime.now()
            current_visits[pground] = pground.visit_set.filter(time_from__lte=now, time_to__gte=now)
            current_visits[pground] = {}
            this_visits = pground.visit_set.filter(time_from__lte=now, time_to__gte=now)
            for visit in this_visits:
                current_visits[pground][visit] = Child.objects.filter(whose_child=visit.who)
                this_children = Child.objects.filter(whose_child=visit.who)

        ctx = {'user': user, 'quarter': quarter, 'pgrounds': pgrounds, 'current_visits': current_visits, 'this_visits': this_visits, 'this_children': this_children}
        return TemplateResponse(request, 'home_login.html', ctx)

因此,对于模板(部件):

<dt>{% for pground, current_visits in current_visits.items %}
            <dd><h3>{{pground.place}}</h3></dd>
                {% for visit in current_visits %}
            <dd>Użytkownik: <mark>{{visit.who}}</mark> na placyku od: {{visit.time_from}}
                do: {{visit.time_to}} {{visit.pground}} <a href="/new_message/{{visit.who.id}}">Send message</a></dd>
                {% for visit, this_visits in current_visits.items %}
                    {% for child in this_visits %}
                        {{child.name}} {{child.age}}
                    {% endfor %}
                {% endfor %}                   
                {% endfor %}
            {% endfor %}
        </dt>

每次去一个特定的游乐场,都会有一整套孩子在场。但我的目标是用这种模式显示信息:对于每次“当前访问”,基于父母、他/她的孩子/孩子。你知道吗

如果你能给我一个建议,告诉我如何离开我被困的地方,我会非常感激的。提前感谢您的帮助!你知道吗


Tags: inchildfortimemodels孩子visitcurrent
1条回答
网友
1楼 · 发布于 2024-04-18 01:00:25

在父模型和子模型中设置相关的\u名称,如

class Child(models.Model):
     name = models.CharField(max_length=128)
     age = models.IntegerField(choices=AGE, default=-1)
     sex = models.IntegerField(choices=SEX, default=1)
     whose_child = models.ForeignKey(User, related_name='children')

在查询时,您可以修改您的查询,如:

this_visits = pground.visit_set.filter(time_from__lte=now, time_to__gte=now).prefetch_related('parent__children')

假设父母和孩子是你的相关名字。你知道吗

相关问题 更多 >

    热门问题