【问题标题】:Distinc values of items coming from two querysets in Django view/template来自 Django 视图/模板中两个查询集的项目的不同值
【发布时间】:2020-05-27 15:14:25
【问题描述】:

我需要输出一个表演者的作品列表。同样的工作可以在两种不同类型的事件中多次执行(例如performanceOfWorkEvent 模型)。

class Work(models.Model):

    title = models.CharField(max_length=200) # max_length = required

class performanceOfWork(models.Model):

    solo_performer = models.ManyToManyField(Profile)
    performed = models.ForeignKey('Work', on_delete=models.CASCADE)

class Event(models.Model):

    solo_performer = models.ManyToManyField(Profile)
    repertoire = models.ManyToManyField(Work, blank=True)

在视图中,我设法从两个模型中获得了不同的值:

context['repertoire_from_works'] = performanceOfWork.objects.filter(solo_performer=self.get_object().id).values('performed__title').distinct()
context['repertoire_from_events'] = Event.objects.filter(solo_performer=self.get_object().id).values('repertoire__title').distinct()

但是,我该如何处理在两个模型中执行的相同工作?我只想输出一次。这是一个非常不稳定的尝试(它不起作用,因为它检查了一个嵌套循环中的两个值):

      <ul>{% for work_works in repertoire_from_works.all %}
        {% for work_events in repertoire_from_events.all %}
          {% if work_works.performed__title == work_events.repertoire__title%}
            {% if forloop.first %}
            <li>{{ work_works.performed__title }}</li>
            {% endif %}

          {% else %}
          <li>{{ work_events.repertoire__title }}</li>
          <li>{{ work_works.performed__title }}</li>
          {% endif %}
        {% endfor %}
      {% endfor %}
      </ul>

【问题讨论】:

    标签: python django django-models django-views django-templates


    【解决方案1】:

    可以,可以在Work型号上查询:

    from django.db.models import Q
    
    object = self.get_object()
    context['works'] = Work.objects.filter(
        Q(performanceofwork__solo_performer=object.id) |
        Q(event__solo_performer=object.id)
    ).distinct()

    这将为您提供一组不同的 Work 对象,这通常会更好,因为 Django 模型比一组标量值“更丰富”。如果两个作品的标题相同,则返回不同的作品。

    如果你真的只需要标题,那么你可以使用:

    from django.db.models import Q
    
    object = self.get_object()
    context['works'] = Work.objects.filter(
        Q(performanceofwork__solo_performer=object.id) |
        Q(event__solo_performer=object.id)
    ).values_list('title', flat=True).distinct()

    然后你得到一个可迭代的字符串(标题)。

    【讨论】:

    • 你又一次成功了!伟大的东西,威廉。并在我的查询集末尾添加.order_by('title') 按标题对其进行排序。谢谢。
    猜你喜欢
    • 2014-05-09
    • 2022-01-22
    • 2018-06-27
    • 1970-01-01
    • 1970-01-01
    • 2023-04-09
    • 1970-01-01
    • 1970-01-01
    • 2018-07-10
    相关资源
    最近更新 更多