gpt4 book ai didi

Django Tastypie : Getting extra-values of a m2m relationships using intermediate model

转载 作者:行者123 更新时间:2023-12-02 02:32:35 25 4
gpt4 key购买 nike

我正在尝试通过中间模型(通过关键字)将 Tastypie 与 ManyToMany 关系结合使用 ( https://docs.djangoproject.com/en/dev/topics/db/models/#extra-fields-on-many-to-many-relationships )

我正在使用这些模型:

class Point(models.Model):
...
value = models.FloatField(_('Value'), null=True)
rooms = models.ManyToManyField('rooms.Room', through='points.PointPosition')

class Room(models.Model):
title = models.CharField(max_length=64)

class PointPosition(models.Model):
point = models.ForeignKey('points.Point', verbose_name=_('Point'))
room = models.ForeignKey('rooms.Room', verbose_name=_('Room'))
x = models.IntegerField(_('Y'))
y = models.IntegerField(_('X'))

我已经能够获取多对多关系,但无法获取额外的字段。这是我的 Tastypie 代码:

class PointResource(ModelResource):
class Meta:
queryset = Point.objects.select_related(
depth=10
).prefetch_related('rooms').all()
resource_name = 'point'
allowed_methods = ['get']

...
value = fields.FloatField()
rooms = fields.ToManyField('rooms.api.RoomResource', 'rooms', full=True)

class RoomResource(ModelResource):
class Meta:
queryset = Room.objects.all()
resource_name = 'room'
allowed_methods = ['get']

我一直在尝试使用一种方法来水合我的PointResource中的房间变量,如下所示:

def dehydrate_rooms(self, bundle):                                                                                                                                                                                                                          
rooms = []
for room in bundle.obj.rooms.all():
position = PointPosition.objects.get(
room_id = room.pk,
point_id = bundle.obj.pk)
rooms.append({'id': room.pk,
'title': room.title,
'x': position.x,
'y': position.y})
return rooms

但问题是,它会创建与我拥有的积分一样多的查询:当您拥有 +8000 积分时,它是真正的性能 killer

我无法找到任何有用的资源来提高性能。我正在考虑使用可用于 QuerySet 的 .extra() 方法进行自定义查询,但 JOIN 关键字不可用(该补丁在几个月前已被拒绝)。而且我不确定 SELECT 子查询是否能解决问题。

最佳答案

您是否考虑过更改查询集以使用 PointPosition 资源?从听起来来看,“Point”在数据库中的含义实际上与“Point”在 API 中的含义并不相同,因此需要进行一些翻译来隐藏内部详细信息:

class PointResource(ModelResource):
class Meta:
queryset = PointPosition.objects.select_related("point", "room")
resource_name = 'point'
allowed_methods = ('get', )

以需要调整过滤参数为代价,这将避免需要执行多个查询。您的脱水方法可以根据需要交换数据。您还可以通过使用 .values() 仅提取必要的字段作为字典而不是完整的对象来节省一些开销。

关于Django Tastypie : Getting extra-values of a m2m relationships using intermediate model,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11525651/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com