我一直在寻找没有找到任何相关信息的日子(或者除了文档之外还有很多一般的tastypie)......
我对一个非常简单的tastypie api返回的结果有疑问。 db有一个没有主键的表(这是一个遗留数据库,我不能修改或管理它,所以我坚持使用它)。所以,为了与django合作,我设置了很多:
primary_key=True
在组合的模型字段中,组成一个唯一的标识符。那么,这就是模型的样子:
class ClientAccount(models.Model):
dt = models.DateField()
date_int = models.IntegerField(primary_key=True)
account = models.CharField(max_length=9, primary_key=True)
product = models.CharField(max_length=5,primary_key=True)
amount = models.IntegerField()
class Meta:
db_table = 'client_account'
managed = False
ordering = ['-date_int']
这里有一些数据(为简单起见,格式化为伪json):
{
dt=2014-08-29
date_int=20140829
account='hello'
product='rice'
amount=10
}
{
dt=2014-08-29
date_int=20140829
account='world'
product='rice'
amount=20
}
{
dt=2014-08-29
date_int=20140829
account='spam'
product='rice'
amount=10
}
{
dt=2014-08-29
date_int=20140829
account='eggs'
product='rice'
amount=20
}
{
dt=2014-08-29
date_int=20140829
account='foo'
product='beans'
amount=5
}
这就是API:
class ClientResource(ModelResource):
class Meta:
queryset = ClientAccount.objects.all()
resource_name = 'client/account'
filtering = {
'date_int': ALL,
'product': ALL,
}
现在,当我按如下方式调用api url时:
http://127.0.0.1:8000/api/v1/client/account/?product=rice&format=json&offset=0&dt=2014-08-29&limit=1
我说,"你好"帐户。如果我刷新(通过点击F5或点击浏览器上的刷新按钮),我可能会得到" world"帐户。
虽然我知道我可能会在刷新时得到不同的结果(假设模型只按date_int排序,并且有两个记录具有相同的date_int),在分页后得到不同的结果似乎是不可接受的...例如如果我去"下一个"网址:
http://127.0.0.1:8000/api/v1/client/account/?product=rice&format=json&offset=1&dt=2014-08-29&limit=1
我可能会收到"垃圾邮件"帐户,或者鸡蛋" ,如果我返回,即offset = 0,我会得到一个不同的帐户,即不是"你好"帐户...我可以获得任何其他帐户,但它们不会有任何明显的顺序。这使得分页无用,因为人们实际上无法覆盖整个帐户,因为在每个分页时,tastypie会提供不同的结果......
就像我说的,我无法找到任何关于此的信息,我将非常感谢您的帮助!
谢谢!
答案 0 :(得分:1)
请注意Django docs:
每个模型只需要一个字段即可使primary_key = True(或者 明确声明或自动添加)。
即。我希望问题是你的Django模型定义有多个primary_key=True
字段,而不是Tastypie。
feature request to remedy this is tracked但是它不会及时降落以解决您的问题。