如何在TastyPie中实现反向关联查询?已知Django实现方式
在TastyPie中实现反向关系追踪的方法
我之前也踩过这个坑!TastyPie官方文档确实对反向关系这块讲得比较模糊,但其实用内置的字段配置就能轻松搞定,跟Django的反向关联逻辑是对应的,只是需要在Resource里明确声明。
先理清楚你的模型结构:你有一个Gallery模型,通过外键关联到User,Django默认会给User生成一个反向关联属性gallery_set(如果你在ForeignKey里指定了related_name,那就用你设置的那个名字)。接下来我们只需要在TastyPie的Resource里把这个反向关系暴露出来就行。
步骤1:定义基础的GalleryResource
首先先把Gallery对应的Resource写好,关联到UserResource:
from tastypie.resources import ModelResource from tastypie import fields from .models import Gallery from django.contrib.auth.models import User class GalleryResource(ModelResource): # 正向关联到User user = fields.ForeignKey('yourapp.resources.UserResource', 'user') class Meta: queryset = Gallery.objects.all() resource_name = 'gallery'
步骤2:在UserResource中添加反向关联字段
接下来在UserResource里,用ToManyField来声明反向关系,关键是要指定反向属性名或者reverse参数:
class UserResource(ModelResource): # 反向关联到Gallery,这里的gallery_set是Django默认的反向属性名 galleries = fields.ToManyField( 'yourapp.resources.GalleryResource', 'gallery_set', related_name='user', # 对应Gallery里的user外键字段 full=True # 如果需要返回画廊的完整数据而不是URI,就加上这个参数 ) class Meta: queryset = User.objects.all() resource_name = 'user'
关键细节说明
- 如果你的
Gallery模型里给外键设置了related_name,比如:
那上面的user = models.ForeignKey(User, on_delete=models.CASCADE, related_name='galleries')gallery_set就要改成galleries,和你设置的related_name保持一致。 - 用字符串路径(比如
'yourapp.resources.GalleryResource')而不是直接导入类,可以避免循环导入的问题,这在关联Resource时很常见。 - 如果需要对反向关联的结果进行过滤(比如只返回公开的画廊),可以自定义一个方法作为
attribute参数:def get_public_galleries(self, bundle): # 只返回当前用户的公开画廊 return bundle.obj.gallery_set.filter(is_public=True) class UserResource(ModelResource): galleries = fields.ToManyField( 'yourapp.resources.GalleryResource', attribute=get_public_galleries, full=True ) # ... 其他配置
测试效果
当你访问用户的API端点(比如/api/v1/user/1/)时,返回的JSON数据里就会包含galleries字段,里面是该用户关联的所有画廊的详细信息(如果设置了full=True),或者对应的资源URI。
这样就能实现你要的反向关系追踪啦!
内容的提问来源于stack exchange,提问作者patrickdamery
相关产品推荐
相关产品推荐

