2012-11-09 23 views
7

Django modelimde 10 tane alanım var ve 3 tane de yabancı anahtar var. Bir GET isteğinden alınan JSON verilerimde, tüm alanları alıyorum, ancak yabancı anahtarları değil.Yabancı anahtar öğelerini yükleme Tastypie

Ben de bunu yapmış, ama yine de bu JSON veri alanları almıyorum: Örneğin

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])) 

, ben city gibi modelinde alanı var, ama bu alan mevcut değildir JSON ondan alırım.

JSON'da city:city__name'u otomatik olarak alabilir miyim? Eğer bunu yaparsam

, o zaman ben şehir olsun ama tanımlamadan bunu yapabilir:

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

cevap

11

Sen yabancı anahtar alanlar için related resources oluşturmak istersiniz ve onları MyResource gömülecek. Gömülü kaynağı full=True yaparsanız, MyResource getirilirken onu dehidrate eder, aksi takdirde ilgili kaynak uri olarak gömülür.

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


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

    class Meta: 
     ... 

Ardından MyResource için GET isteğinde ?related__field=value göre filtreleme yapabilirsiniz.


sadece modeli en __unicode__ tarafından döndürülen alanını isteyen ediyorsanız, aşağıdaki (ziyade ilgili kaynak katıştırma) yaparak deneyebilirsiniz: "şehir" alanı

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

    class Meta: 
     ... 

olduğunu MyData modelindeki yabancı anahtarın adı.

+0

Herhangi bir kaynak tanımlamaksızın bunu yapmak için herhangi bir yolu var mı. Othwise, her modelimin kaynağını djnago'da yapmaya çalışıyorum. Zaman israfı değil mi – user825904

+0

Ek kaynak yapmak en iyi seçim olacaktır. Çıplak minimum kaynak oluşturabilir, bunları API’dan uzak tutabilirsiniz (bunları URL’lerinize eklemeyin) ve bunları "full = True" ile gömebilirsiniz. O kadar fazla iş olmayacak. Aksi halde, dehidrat yöntemi alternatiftir. – Blake