Django tastypie: Ресурсы показывают разные в подробном запросе как в запросе списка - PullRequest
6 голосов
/ 23 ноября 2011

Я только начинаю с django tastypie, и я в восторге от этого.Мой вопрос: я ищу ту же функцию, что и в представлении администратора: укажите для полей чужих ключей, что нужно видеть в ответе других объектов, а что в подробном ответе.

Допустим, это моя простая модель:

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, вы просто получите URL с идентификатором, если вы используетеfull=True вы получите всю информацию.В действительности у местоположения есть намного больше информации.Мне нужно чуть больше информации, чем full = 'False', но не вся информация, использующая full=True.Я не хочу использовать опцию исключения, потому что у меня нет информации в подробной информации или в списке объекта Location itselve.

один из вариантов, о котором я думал, - это сделать 2ресурсы для того же объекта, но это не кажется лучшим решением (но я думаю, это будет работать).Кстати: я подумал над этим вариантом, не будет работать (конечно), лучше использовать обходной путь, предложенный в ответе bmihelac (спасибо).

Хотя ... попытка обходного пути ... приводит меня кновый вопрос, см .:

django-tastypie: невозможно получить доступ к bundle.request в дегидрате (self, bundle)

Ответы [ 3 ]

5 голосов
/ 29 октября 2013

Хорошие новости! Это добавлено в вкусный пирог.

Если вы хотите настроить поле только на определенных страницах, просто определите атрибут use_in как «все», «список» или «подробно».

Подробнее здесь , но я приведу пример для потомков:

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

Все просто!

5 голосов
/ 23 ноября 2011

Существует запрос функции для различных полей в show и index, наряду с некоторым обсуждением того, как это можно реализовать:

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

Пока эта функция не включена, может быть, вы можете помочь с этим обходным путем:

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

0 голосов
/ 09 сентября 2013

Между прочим, я переключился на другой перезаписываемый фреймворк django api, см. http://django -rest-framework.org / . Так что я больше не пользуюсь вкусным пирогом. Однако этот вопрос и ответ, вероятно, все еще полезны для других.

Я обнаружил, что django-rest-framework гораздо проще и гибче в реализации. Я не нашел ничего, что бы я не смог сделать с этим фреймворком (ну, это не приносит мне кофе).

...