我有3个型号.游戏,玩家和作品.玩家附加到游戏上并且玩家附加到玩家.关系是简单的外键.
在检索游戏时,我还希望从所有玩家中检索所有棋子并将其包含在结果中.
class GameResource(ModelResource):
class Meta:
queryset = Game.objects.all()
resource_name = 'game'
allowed_methods = ['get']
class PlayerResource(ModelResource):
game = fields.ForeignKey(GameResource, 'game')
class Meta:
queryset = Player.objects.all()
resource_name = 'player'
allowed_methods = ['get']
class PieceResource(ModelResource):
player = fields.ForeignKey(PlayerResource, 'player')
class Meta:
queryset = Piece.objects.all()
resource_name = 'piece'
allowed_methods = ['get']
Run Code Online (Sandbox Code Playgroud)
我不知道这是怎么做到的.我最初改变了脱水,以便它只是做正确的查询,调用django serialize,并将它放在bundle中的一个新变量中.这对我来说似乎是一个躲闪.查询集的序列化也被tastypie再次序列化,导致它转义引号字符(urgh).
我有一个tastypie modelRseource,看起来像这样:
class TaggedResource(ModelResource):
tags = ListField()
user = fields.ForeignKey(UserProfileResource, 'user')
class Meta:
queryset = Media.objects.all().order_by('-timestamp')
authorization = MediaAuthorization()
detail_allowed_methods = ['get', 'post', 'put', 'delete','patch']
filtering = {
#'user': ALL_WITH_RELATIONS,
#exact is date, lt is less than lte less than equal to, etc
'timestamp': ['exact', 'range', 'lt', 'lte', 'gte', 'gt'],
'social_source': ALL,
'media_type': ALL,
'comment': ['exact', 'startswith', 'endswith', 'contains'],
'media_text': ['exact', 'startswith', 'endswith', 'contains'],
}
Run Code Online (Sandbox Code Playgroud)
我需要在过滤器之间使用OR运算符,并且希望将查询合并到一个参数中.例如,我想从注释字段OR media_text字段返回包含单词"test"过滤的对象.
这将是理想的:http:mysite.com/api/v1/tagged?q = test
其中'q'对两个字段执行OR过滤.
这可行吗?
更新:这是我正在使用的高级过滤器,但我不确定如何获得一个OR语句:
def build_filters(self, filters=None):
if …Run Code Online (Sandbox Code Playgroud) 是否可以使用tastypie在相关模型上包含字段?
根据我的模型如下:如果我将一个VideoContent和一个TextContent实例持久保存到数据库,那么我可以从我的内容资源中获取2个对象,但是没有其他字段可用.
是否可以包含相关模型中的字段(在这个例子中,视频网址和文本内容),并且将来可以满足添加更多内容类型的需要,而无需重写内容资源,或者我是从方向错误?
目标是能够使用更多ContentTypes扩展它,而无需更改Content资源(假设它可以在第一时间使其工作)
Models.py:
class Content(models.Model):
parent = models.ForeignKey('Content', related_name='children', null=True, blank=True)
class TextContent(Content):
text = models.CharField(max_length=100)
class VideoContent(Content):
url = models.CharField(max_length=1000)
Run Code Online (Sandbox Code Playgroud)
然后我的资源:
class ContentResource(ModelResource):
children = fields.ToManyField('myapp.api.resources.ContentResource', 'children', null=True, full=True)
class Meta:
resource_name = 'content'
queryset = ContentResource.objects.all()
authorization = Authorization()
always_return_data = True
Run Code Online (Sandbox Code Playgroud) 你如何从它的uri获得tastypie模型资源的模型对象?
例如:
如果在python中将uri作为字符串给出,那么如何获得该字符串的模型对象?
我在添加资源方面遇到了一些问题,由ApiKey用户关联,问题恰恰是"出租车"字段,当我评论时,"create_object"工作正常.有资源
Resouces
class LocationResource(ModelResource):
user = fields.ForeignKey(AccountResource, 'user', full=True)
taxi = fields.ToManyField(TaxiResource, attribute=lambda bundle: Taxi.objects.filter(user=bundle.obj.user), full=True, null=True)
class Meta:
queryset = Location.objects.all().order_by('-id')
resource_name = 'location'
list_allowed_methods = ['post', 'get']
authentication = ApiKeyAuthentication()
authorization = Authorization()
filtering = {'user': ALL_WITH_RELATIONS}
def obj_create(self, bundle, **kwargs):
if bundle.request.method == 'POST':
return super(LocationResource, self).obj_create(bundle, user=bundle.request.user)
Run Code Online (Sandbox Code Playgroud)
楷模
from django.contrib.auth.models import User
class Taxi(models.Model):
STATUS_CHOICES = (
('Av', 'Available'),
('NA', 'Not Available'),
('Aw', 'Away'),
)
user = models.OneToOneField(User)
license_plate = models.TextField(u'Licence Plate',max_length=6,blank=True,null=True)
status = models.CharField(u'Status',max_length=2,choices=STATUS_CHOICES)
device …Run Code Online (Sandbox Code Playgroud) 我尝试在我的Django应用程序中获取有关我的身份验证用户的详细信息.
为此,我创建了一个新资源:
class MyUserResource(ModelResource):
class Meta:
queryset = ReaderUser.objects.all()
resource_name = 'me'
list_allowed_methods = []
detail_allowed_methods = ['get']
authorization = Authorization()
authentication = SessionAuthentication()
excludes = ('password', 'id', 'is_active', 'is_admin', 'last_login')
def apply_authorization_limits(self, request, object_list):
print request.user
return object_list.filter(pk=request.user.pk)
def prepend_urls(self):
return [
url(r"^(?P<resource_name>%s)/$" % self._meta.resource_name, self.wrap_view('dispatch_detail'), name="api_dispatch_detail"),
]
Run Code Online (Sandbox Code Playgroud)
当我使用API调用我时,/api/me/?format=json
我得到以下内容:More than one resource is found at this URI.
我也试过没有prepend_urls.我不明白的是该print语句永远不会在方法中执行apply_authorization_limits
关于我做错了什么的暗示?
使用TastyPie我有一个拥有FK用户的模型资源.当我对API发布POST时,我必须包含这样的用户ID:
data : JSON.stringify({ name : 'value a', user : '12' }),
Run Code Online (Sandbox Code Playgroud)
我的用户必须通过登录或使用API密钥以及用户名和密码进行身份验证.在这两种情况下,我都知道用户是谁.
1)如何让用户确保user1不为user2创建资源?
2)或者完全发送用户ID是违反直觉的?我应该以某种方式从授权细节中获取用户,如果是这样的话?
在Django中使用REST api而不是视图的主要优点是什么?
可以在REST api和Views(在一个应用程序中使用REST api,在另一个应用程序中使用Views)中混合使用吗?
或者我们是否需要为所有应用编写REST api?而不是混合REST和视图
当我的Django项目中有未捕获的异常时,日志只显示一条简单的"HTTP 500"消息.HTTP响应将包含完整的堆栈跟踪作为HTML,但是当我开发Web服务未被Web浏览器使用时,这不是非常有用.如何在Django日志中显示未捕获的异常的完整堆栈跟踪?
我尝试使用"process_exception"方法安装自定义中间件,并为"got_request_exception"事件安装自定义信号处理程序,但这些处理程序都没有被调用过.
我正在使用Django 1.6.1和Tastypie 0.11.0,我正在调试模式下运行.
假设你想要放弃
{field1, field2, field3}详细请求.
{field1, field2}在列表请求上.
{field1}在其他一些更简单的列表请求.
我已经看到使用get_serializer_classself.action的示例,它可以处理详细信息与列表方案.(/sf/answers/1592895391/)
我应该定义两个视图集和两个url端点吗?
或者这里有更好的方法吗?
我想这也适用于tastypie.(两个资源?)