6

我刚从 django sweetpie 开始,我对此很热情。我的问题:我正在搜索与管理视图中相同的功能:指定外键字段在其他对象的列表响应中看到什么以及在详细响应中看到什么。

假设这是我的简化模型:

class Location(models.Model):
    name = models.CharField(max_length=256, blank=True)
    longitude = models.FloatField(blank=True, default=0.0)
    latitude = models.FloatField(blank=True, default=0.0)
    description = models.CharField(max_length=256, blank=True)
    shortname = models.CharField(max_length=256, blank=True)
    tooltiptext = models.CharField(max_length=1000, blank=True)
    locationtype = models.ForeignKey(LocationType, blank=True, null=True)
    public_anonymous = models.BooleanField(default=False, blank=False, null=False)
    public_authorized = models.BooleanField(default=False, blank=False, null=False)
    def __str__(self):
        return '%s' % (self.name)

class Variable(models.Model):
    abbreviation = models.CharField(max_length=64, unique=True)    
    name = models.CharField(max_length=256, blank=True)
    unit = models.CharField(max_length=64, blank=True)
    def __str__(self):
        return '%s  [%s]' % (self.name, self.unit)

class Timeseries(models.Model):
    locationkey = models.ForeignKey(Location)
    variablekey = models.ForeignKey(Variable)
    tstypekey = models.ForeignKey(TimeseriesType)

    def __str__(self):
        return '%s: %s (%s)' % (self.locationkey.name, self.variablekey.name, self.tstypekey.name)

这些是我的 api 资源:

class LocationResource(ModelResource):
    class Meta:
        queryset = Location.objects.all()
        resource_name = 'location'
        excludes = ['public_anonymous', 'public_authorized']
        authentication = BasicAuthentication()
        authorization = DjangoAuthorization()

class VariableResource(ModelResource):
    class Meta:
        queryset = Variable.objects.all()
        resource_name = 'variable'
        authentication = BasicAuthentication()
        authorization = DjangoAuthorization()

class TimeseriesTypeResource(ModelResource):
    class Meta:
        queryset = TimeseriesType.objects.all()
        resource_name = 'timeseriestype'
        authentication = BasicAuthentication()
        authorization = DjangoAuthorization()

class TimeseriesResource(ModelResource):
    location = fields.ForeignKey(LocationResource, 'locationkey', full=False) 
    variable = fields.ForeignKey(VariableResource, 'variablekey', full=False) 
    timeseriestype = fields.ForeignKey(TimeseriesTypeResource, 'tstypekey', full=False) 

    class Meta:
        queryset = Timeseries.objects.all()
        resource_name = 'timeseries'
        authentication = BasicAuthentication()
        authorization = DjangoAuthorization()

在 TimeseriesResource 中,如果你使用full=False,你只会得到一个带有 id 的 url,如果你使用,full=True你会得到所有的信息。实际上,该位置有更多信息。我只需要比 full='False' 多一点的信息,但不是所有使用full=True. 我不想使用排除选项,因为我没有详细信息或 Location 对象本身的列表中的信息。

我正在考虑的选项之一是为同一个对象制作 2 个资源,但这感觉不是最好的解决方案(但我想它会起作用)。顺便说一句:我考虑过这个选项,将不起作用(当然),最好使用 bmihelac 的答案中使用的解决方法(谢谢)。

虽然......尝试解决方法......让我想到一个新问题,请参阅:

django-tastypie:无法在脱水(自我,捆绑)中访问 bundle.request

4

3 回答 3

5

show和中的不同字段有一个功能请求,并index讨论了如何实现它:

https://github.com/toastdriven/django-tastypie/issues/18

在不包含此功能之前,也许您可​​以帮助解决此问题:

https://github.com/toastdriven/django-tastypie/issues/18#issuecomment-2695447

于 2011-11-23T17:53:12.183 回答
5

好消息!这已被添加到美味派。

如果您希望将字段设置为仅在某些页面上,只需将use_in属性定义为“全部”、“列表”或“详细信息”。

更多信息在这里,但我会为后代提供一个例子:

class DocumentResource(ModelResource):
    my_field = fields.CharField(attribute='my_field', use_in='detail')

就那么简单!

于 2013-10-29T19:58:47.060 回答
0

顺便说一句,我切换到另一个 restfull django api 框架见http://django-rest-framework.org/。所以我不再使用美味派了。但是,这个问题和答案可能对其他人仍然有用。

我发现 django-rest-framework 在实现它的方式上更容易和更灵活。我没有发现任何我不能用这个框架做的事情(好吧,它不会给我带来咖啡)。

于 2013-09-09T07:08:27.037 回答