【问题标题】:GqlQuery OrderBy a property in a ReferencePropertyGqlQuery OrderBy 在 ReferenceProperty 中的一个属性
【发布时间】:2009-10-03 18:05:44
【问题描述】:

我不知道如何通过 ReferenceProperty 的属性进行 GqlQuery 排序。

在这种情况下,我想获取所有座位,但按房间的 ID 排序

GqlQuery 引用不允许连接,那么在这种情况下您如何处理?

class Room(db.Model):
    id = db.IntegerProperty()
    dimension = db.StringProperty(multiline=True)

一个房间有很多座位,每个座位都有一个 id

class Seat(db.Model):
    id = db.IntegerProperty()
    roomId = db.ReferenceProperty(Room)



seats_query = GqlQuery("SELECT * FROM Seat ")
seats = seats_query.fetch(1000)

Alex 的观点是正确的,所以我决定不碰 GqlQuery,而是尝试使用 Django 模板,我找到了按 Room'id 对 Seat 进行排序的解决方案,而无需在 Seat 类中添加新字段。

如果有人感兴趣,我把代码放在这里;))干杯;))

        {% regroup seats|dictsort:"roomId.id" by roomId.id as room_list %}
        <ul>
         {% for room in room_list %}
          <li>Room: {{room.grouper}}
            <ul>
            {% for item in room.list %}
            <li>Seat no: {{item.id}} </li>
            {% endfor %}
            </ul>
          </li>
          {% endfor %}
        </ul>

【问题讨论】:

    标签: python django google-app-engine


    【解决方案1】:

    一般来说,要解决非关系数据库缺乏 JOIN 功能的问题,您需要进行非规范化;具体来说,您将数据片段冗余地放置在多个位置,因此可以在查询中有效地访问它们(这确实使更新存储变得更加麻烦,但是,一般来说,非关系数据库非常倾向于读取 - 主要是应用程序)。

    在这种情况下,您向Seat 添加一个带有房间ID 的属性——因为您专门调用了roomId(而不是roomreference座位的房间,我猜你会把这个非规范化的位作为roomIdId

    【讨论】:

    • omg,这意味着我没有任何解决方案可以在不向我的模型添加额外数据的情况下通过房间的 id 订购座位:-s 如果您已经有大量数据该怎么办你的数据库?
    • @Hoang,您可以向所有现有席位添加一个字段,一次 N 个,例如每组一个房间的席位应该没问题(使用任务队列)。一般来说,您只能按您拥有的字段排序——这是非关系数据库的一个关键限制(以换取可伸缩性等)。
    • 嗨,亚历克斯,我使用 Django 模板修改了问题的答案来解决我的问题;)干杯;)
    • 如果您想在应用程序级代码中进行排序,您可以通过多种方式进行,当然(在模板中这样做有点极端恕我直言,一个好的折衷方案可能是在视图的 Python 代码);我以为你想让商店为你做这件事。
    【解决方案2】:

    我认为在你的情况下它会按你的意愿工作:

    class Seat(db.Model):
        id = db.IntegerProperty()
        roomId = db.ReferenceProperty(Room,collection_name='seats')
    

    然后你可以使用这样的东西:

    rooms = Room.all().order('id')
    for room in rooms:
        seat_at_room = room.seats.order('id')
    

    【讨论】:

      猜你喜欢
      • 2017-06-07
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-08-01
      • 1970-01-01
      相关资源
      最近更新 更多