如何在不修改原始对象的情况下修改Django查询集中对象的属性以进行数据呈现?

dgsult0t  于 2023-07-01  发布在  Go
关注(0)|答案(1)|浏览(125)

我想展示一个对象列表,在数据展示过程中,我想过滤/修改这些对象的一个属性。类似于注解的东西,但我没有用注解来做。这些是模型

class Airline (models.Model):
   name = models.CharField()
   destinations = models.ManyToManyField("city")
   customers = models.ManyToManyField("user")

class City (models.Model):
   name = models.CharField()
   country = models.CharField()
 
class User (models.Model):
   name = models.CharField()
   preferredDestinations = models.ManyToManyField("city")

我想,对于一个给定的用户,目前的航空公司的用户是客户的列表,并为每个航空公司目前的航空公司的目的地列表。但是,我不想显示所有的航空公司目的地,而只想显示用户首选的目的地。
例如,g,

Airline1.destinations=["New York", "London", "Paris", "Madrid]
Airline2.destinations=["Madrid", "Barcelona", "Rome", "Berlin", "London"]

User1.preferredDestinations=["Madrid", "Barcelona", "Paris"]

由于user 1是Airline 1和Airline 2的客户,我希望页面显示一个表,显示每个航空公司飞往哪个用户首选目的地。也就是说,我不想看到航空公司飞往的所有目的地,只想看到用户感兴趣的目的地:例如

Welcome User1!
These are your airlines that fly to your preferred destinations
Airline    | Destination |
| -------- | --------  |
| Airline1 | Madrid    |
|          | Paris     |
| -------- | --------  |
| Airline2 | Madrid    |
|          | Barcelona |

在视图中,我为用户获取一个查询集
airlineSet = Airline.objects.filter(customers=user.id)
在模板中

{% for airline in airlineSet %}
  <tr>
  <td>
   {{ airline.name }}
  </td>
  <td>
    {% for city in airline.destinations.all %}
    <li>
      {{ city }}
    </li>
    {% endfor %} 
  </td>
  </tr>
{% endfor %}

这显示了航空公司的所有目的地,但我需要一个子集,它是airline.destinationsuser.preferredDestinations的交集
我试图获取子集并将其放入查询集airlineSet中的对象的属性destination中,但这实际上修改了原始的Airline对象,并扰乱了数据库。
我想用城市的子集在查询集中创建注解,但似乎它限制了你可以用注解添加的内容(count,max,mix)。我不知道如何添加这样的注解。
此外,在上面的例子中,我放了几个城市,但实际上对于航空公司和用户来说,它可以是一个相当长的城市数量,我想限制概述页面中显示的城市数量,不要过多地显示大城市列表,而是显示一个短列表(当我点击航空公司时,它会显示整个联盟)。
我在模板{% if city in preferredDestinations %}中创建了交叉点,但这对限制城市数量有限制。
这是一个可以在View上实现的东西吗?

lvjbypge

lvjbypge1#

你能做的是

{% for airline in airlineSet %}
  <tr>
  <td>
   {{ airline.name }}
  </td>
  <td>
    {% for city in airline.destinations.all %}
    
      {% if city in user.preferredDestinations %}
        <li>
          {{ city }}
        </li>
      {% endif %}
    
    {% endfor %} 
  </td>
  </tr>
{% endfor %}

为了不显示太多的城市,我建议使用分页。

相关问题