2013-08-08 3 views
1

В django у меня есть две модели - User и UserProfile. Может существовать нулевой или один профиль для определенного пользователя. Я пытаюсь включить информацию из модели UserProfile непосредственно в UserResource.Получение от ToManyField до значений модели

Я бы хотел использовать профиль ToManyField, если он существует, для доступа к содержимому связанной модели UserProfile. Я пробовал различные вещи в дегидрате, включая self.profile.get_related_resource (self) и UserProfile.objects.get (id = ...), но я не могу найти путь от поля профиля до модель объекта. Кто-нибудь может мне помочь?

Я до сих пор новичок в Python, Django и Tastypie, поэтому, надеюсь, если я буду делать что-то ужасное, кто-то будет достаточно любезен, чтобы указать на это.

Цель состоит в том, чтобы иметь JSON, который выглядит следующим образом: { ResourceURI:/v1/пользователи/1 date_of_birth: 1 января 1980 ... и т.д. }

где date_of_birth является собственностью UserProfileResource. Мне не нужны все поля из UserProfileResource, и я не хочу, чтобы UserProfile был вложенным объектом в ответе. Я хочу, чтобы некоторые поля из UserProfileResource были полями верхнего уровня в ответе, чтобы они выглядели как часть ресурса пользователя.

class UserResource(ModelResource): 
    profile = fields.ToOneField('foo.api.UserProfileResource', 'user', null=True) 

    class Meta: 
     queryset = User.objects.all() 
     resource_name = 'users' 
     allowed_methods = ['get'] 
     #etc... 


class UserProfileResource(ModelResource): 
    date_of_birth = ... 
    #etc 

ответ

1

Я предполагаю, что вы используете Django 1.4 и AUTH_PROFILE_MODULE?

Поскольку отношение User: UserProfile равно 1: 1, я бы выбрал вместо ToOneField. Это будет сериализоваться как URI-указатель на ваш UserProfileResource (если таковой существует.) Если вы хотите, чтобы данные поля UserProfileResource встроены в ваш UserResource, вы можете указать full=True в определении ToOneField. С помощью этого метода вам не нужно переопределять обезвоживание.

Также убедитесь, что второй аргумент в определении ToOneField является атрибутом User, который указывает на вашу модель Django UserProfile. Например, если у вас есть OneToOneField(User, related_name='profile') в вашей модели Django, то этот атрибут должен быть profile.

class UserResource(ModelResource): 
    profile = fields.ToOneField('foo.api.UserProfileResource', 'profile', 
           full=True, null=True) 

    class Meta: 
     queryset = User.objects.all() 
     resource_name = 'users' 
     allowed_methods = ['get'] 

Если то, что вы после того, как конкретные поля из экземпляра UserProfile смешанного с вашего пользователя, вы должны быть в состоянии сделать что-то вроде этого:

class UserResource(ModelResource): 
    date_of_birth = fields.DateField('profile__date_of_birth', null=True) 

    class Meta: 
     queryset = User.objects.all() 
     resource_name = 'users' 
     allowed_methods = ['get'] 
     fields = ['userfields', 'gohere', 'date_of_birth'] 
+0

Спасибо, но это Безразлично Не обращай внимания на мою проблему. Цель состоит в том, чтобы сделать части полей верхнего уровня UserProfileResource ответа UserResource. Я уточню в редактировании вопроса. –

+0

Хм, возможно, я прочитал то, что вы сказали слишком быстро. Позвольте мне попробовать. –

+0

А, ты привел меня к другой проблеме. Причина, по которой я использовал ToManyField, заключается в том, что я не могу заставить ToOneField работать, потому что FK переходит из UserProfile в User, а не наоборот. Я все еще играю с этим в другой теме в моей голове. :-) –