2012-11-09 15 views
7

W moim modelu Django mam 10 pól i są 3 pola, które są kluczami obcymi. W moich danych JSON, które są odbierane z żądania GET, otrzymuję wszystkie pola, ale nie klucze obce.Jak załadować elementy kluczy obcych w Tastypie

Zrobiłem też, ale ja wciąż nie uzyskanie tych pól w danych JSON:

DataFields = MyData._meta.get_all_field_names() 
class MyResource(ModelResource): 
     class Meta: 
     queryset = MyData.objects.all() 
     resource_name = 'Myres' 
     serializer = Serializer(formats=['json']) 
     filtering = dict(zip(DataFields, [ALL_WITH_RELATIONS for f in DataFields])) 

Na przykład, mam pole w modelu jak city, ale to pole nie jest dostępny w JSON, który dostaję od tego.

Czy jest jakiś sposób, że w JSON mogę automatycznie uzyskać city:city__name?

Jeśli mogę to zrobić, to dostać się do miasta, ale można to zrobić bez określenia:

def dehydrate(self, bundle): 
     bundle.data["city_name"] = bundle.obj.city__name 
     return bundle 

Odpowiedz

11

Będziemy chcieli stworzyć related resources dla swoich dziedzinach kluczowych zagranicznych i osadzić je w MyResource. Jeśli utworzysz zasób osadzony full=True, będzie on odwadniał go podczas pobierania MyResource, w przeciwnym razie utworzy go jako powiązany zasób URI.

class RelatedResource(ModelResource): 
    class Meta: 
     ... 


class MyResource(ModelResource): 
    related = fields.ForeignKey(RelatedResource, full=True) 

    class Meta: 
     ... 

Następnie można filtrować według ?related__field=value w żądaniu GET do MyResource.


Jeśli jesteś po prostu chcąc pole zwrócony przez model na __unicode__, można spróbować w następujący sposób (zamiast osadzania powiązanego zasobu):

class MyResource(ModelResource):  
    city = fields.CharField(attribute="city") 

    class Meta: 
     ... 

Gdzie „miasto” jest pole nazwa klucza obcego w modelu MyData.

+0

Czy można to zrobić bez definiowania jakiegokolwiek zasobu. W każdym razie, robię zasób mojego modelu w djnago. czy to nie jest strata czasu? – user825904

+0

Dokonywanie dodatkowych zasobów będzie twoim najlepszym wyborem. Możesz tworzyć minimalne zasoby, trzymać je poza interfejsem API (nie dodawać ich do adresów URL) i osadzać je za pomocą 'full = True'. Nie będzie tak dużo dodatkowej pracy. W przeciwnym razie alternatywą jest metoda odwodnienia. – Blake

Powiązane problemy