Django:在数据集中反向查找可选的外键条目和包含

2w3kk1z5  于 2023-06-25  发布在  Go
关注(0)|答案(1)|浏览(93)

我想组成的数据库条目列表,并在另一个表中相应的(但不一定是现有的)相关条目。
具体的上下文是一个事件列表,用户应该能够在其中看到他是否已经声明了他的参与(因此在数据库中有一个应该显示的条目)或没有(这将给予他一个到参与表单的链接)
我的模型(最小):

class Event(models.Model):
    title = models.CharField(max_length = 200)
    #...

class Event_Participation(models.Model):
    EVENT_PARTICIPATION_CHOICES = [
        ("Y", "Yes"),
        ("N", "No"),
         # few other options
    ]
    event = models.ForeignKey(Event, on_delete=models.CASCADE)
    participation = models.CharField(max_length=1, choices= EVENT_PARTICIPATION_CHOICES)
    user = models.CharField(max_length=10) #originally another foreign key

理想情况下,我搜索一个表达式,如 * Event.appendIfExists(Event_Participation)*...
对于模板渲染,我能够查询数据,但这似乎并不优雅,我不知道如何合并模板中的信息:

def event_list(request):
    e_all = Event.objects.all() #normally filtered
    part_list = {}
    for e in e_all:
        if e.event_participation_set.get(user_id = request.user.id) :
            p = e.event_participation_set.get(user_id = request.user.id).participation
        else:
            p = "X"
        part_list[e.id]= p
        context = {"part_list":part_list,"full_event_list":e_all}
        return render(request, "event_list.html", context)

模板中的一个基于索引的变量对 part_list 不起作用,我无法以某种方式扩展查询,这允许我只使用一个像这样的dict:

{% for event in full_event_list %}
        <li> {{ event.title }}
           {# Participation: {% if event.participation %} {{ event.participation }} {% else %} LINK {%endif%}
        </li>
    {% endfor %}

由于这似乎是一个非常常见的应用程序,我可能错过了一些非常明显的东西...

p5cysglq

p5cysglq1#

我们可以使用select_relatedprefetch_related方法来执行数据库连接并减少查询的数量。
我们需要当前用户的Event对象沿着相关的Event_Participation对象。

from django.db.models import Prefetch

def event_list(request):
    participations = Event_Participation.objects.filter(user_id=request.user.id)
    events = Event.objects.all().prefetch_related(
        Prefetch('event_participation_set', queryset=participations, to_attr='user_participations')
    )

    return render(request, "event_list.html", {'events': events})

然后在我们的模板中,我们可以访问每个event的相关Event_Participation对象

{% for event in events %}
    <li>
        {{ event.title }}
        {% for participation in event.user_participations %}
            Participation: {{ participation.participation }}
        {% empty %}
            LINK
        {% endfor %}
    </li>
{% endfor %}

相关问题