【发布时间】:2014-09-03 05:44:09
【问题描述】:
我已经搜索了好几天,但没有找到任何关于此的信息(或者除了文档之外还有很多美味的馅饼)......
我对一个非常简单的 sweetpie api 返回的结果有疑问。数据库有一个没有主键的表(这是一个遗留数据库,我无法修改或管理它,所以我坚持使用它)。所以,为了使用 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 或单击浏览器上的刷新按钮),我可能会获得“世界”帐户。
虽然我知道刷新时可能会得到不同的结果(假设模型仅按 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
我可能会得到“垃圾邮件”帐户或“eggs”,如果我返回分页,即 offset=0,我将得到一个不同的帐户,即不是“hello”帐户...我可能会得到任何其他帐户,但它们不会按任何可辨别的顺序排列。这使得分页毫无用处,因为一个人实际上无法遍历整个帐户集,因为在每次分页时,tastepie 会提供不同的结果......
就像我说的,我无法找到任何有关这方面的信息,非常感谢您的帮助!
谢谢!!
【问题讨论】:
标签: django sorting pagination tastypie