【问题标题】:tastypie random queryset results美味派随机查询集结果
【发布时间】: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


    【解决方案1】:

    注意Django docs

    每个模型只需要一个字段才能具有 primary_key=True(要么 显式声明或自动添加)。

    即我预计问题在于您的 Django 模型定义具有多个 primary_key=True 字段,而不是 Tastypie。

    feature request to remedy this is tracked 但它不会及时降落以解决您眼前的问题。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2018-09-14
      • 1970-01-01
      • 1970-01-01
      • 2011-10-18
      • 2012-10-30
      • 2014-01-23
      • 1970-01-01
      相关资源
      最近更新 更多