GqlQuery OrderBy是ReferenceProperty中的一个属性

时间:2009-10-03 18:05:45

标签: python django google-app-engine

我不知道如何通过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)

亚历克斯是对的,所以我决定不接触GqlQuery,并尝试使用Django模板,我找到了解决方案来排序Seat by Room'id而无需在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>

2 个答案:

答案 0 :(得分:0)

一般来说,要解决缺少JOIN功能的非关系数据库,你要进行非规范化;具体来说,您将数据块冗余地放在多个位置,这样就可以在查询中有效地访问它们(这确实使得更新商店更加麻烦,但是,非关系数据库通常非常倾向于阅读 - 主要是应用)。

在这种情况下,您向Seat添加了一个房间ID的属性 - 因为您特别称为roomId(而不是room参考到座位的房间,我想你的这个非规范化的位是roomIdId

答案 1 :(得分:0)

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

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')