benim ilk soru: görünümde
yüzden uygulamam için API 's olması tastypie kullanıyorum.Ben json işlemek için tastypie kullanabilmek için istiyorum ve daha sonra bir Django görünümünde benim uygulamasının verilerini önyükler, böylece o içerir. Burada Django tastypie yemek kitabı bunun bir örneğidir vardır
: http://django-tastypie.readthedocs.org/en/latest/cookbook.html#using-your-resource-in-regular-views
Sorun burada, ben daha basit daha karmaşık gelen varyantları denedim ve sadece onu almak, bu işe CAN NOT olmasıdır bazı benim modelleri için kod:
class ChatMessage(models.Model):
content = models.TextField()
added = models.DateTimeField(auto_now_add=True)
author = models.ForeignKey(ChatUser, related_name="messages")
chat_session = models.ForeignKey(ChatSession, related_name="messages")
answer_to = models.ForeignKey('self', blank=True, null=True)
flagged = models.BooleanField(blank=True,default=False)
mododeleted = models.BooleanField(blank=True,default=False)
mododeleted_by = models.ForeignKey(ChatUser,blank=True,null=True,default=None)
mododeleted_at = models.DateTimeField(blank=True,null=True,default=None)
[...]
class ChatSession (models.Model):
title = models.CharField(max_length=200)
link_title = models.CharField(max_length=200)
description = tinymce_models.HTMLField()
date = models.DateTimeField()
online = models.BooleanField(default=False)
next_session = models.BooleanField(default=False)
meps = models.ManyToManyField(ChatMep)
uid_newsupdate = models.CharField(max_length=200,blank=True,null=True,default="")
[...]
ve benim kaynaklar:
class ChatMessageResource(MyModelResource):
chat_session = fields.ForeignKey(ChatSessionResource, 'chat_session')
def renderOne(self,request,pkval):
data = self.obj_get(None,pk=pkval)
dbundle = self.build_bundle(obj=data,request=request)
return self.serialize(None,self.full_dehydrate(dbundle),'application/json')
def dehydrate(self, bundle):
bundle.data['likes'] = bundle.obj.get_likes()
bundle.data['likes_count'] = len(bundle.data['likes'])
return bundle
class Meta:
authentication = Authentication()
authorization = Authorization()
queryset = ChatMessage.objects.all()
resource_name = 'message'
fields = ('content', 'added', 'flagged', 'mododeleted','author','answer_to','chat_session')
filtering = {
'chat_session': ALL_WITH_RELATIONS,
}
ve benim bakış endeksi:
Benim istediğimdef index(request):
cur_sess = get_current_chat_session()
data1= ChatMessageResource().renderOne(request,723)
return render_to_response('test.html',
{
'all_data' : data1
},
context_instance=RequestContext(request))
bana BİR ChatMessageResource ait json vermek benim renderOne() fonksiyonudur Ve ayrıca bana TÜM (veya filtrelenmiş) json içinde ChatMessageResources gice bir renderAll() fonksiyonunu istiyorum.
Ve .. ben kendim serialize olabilir BİLMEK ama önemli olan bu değil, tastypie iç görün kullanmak
istiyorum Şu anda hatadır: Ben sadece deli alıyorum
NoReverseMatch at /live/
Reverse for 'api_dispatch_detail' with arguments '()' and keyword arguments '{'pk': 14L, 'resource_name': 'session'}' not found.
, Saatlerce çalışıyorum.
Peki, nasıl bir Django görünümünde tastypie kullanarak kod tarafından JSON olarak BİRİ/TÜM kaynak almak için lütfen!
net değil ya da sadece isteyin netleştirmek gerekirse, teşekkür
Gerçekten ne yapmak istiyorum JSON benim yarattığım bir API url tarafından döndürülen almak mümkün olmakla birlikte, koddan değil url'yi ziyaret ederek .. Yani bir mesaj listesi döndüren /api/v1/messages/?chat_session=14
varsa, aynı kodu kullanarak (ve url'yi curl veya herhangi bir şeyle getirerek değil) yapmak istiyorum.
Not: Bir standarda doğrudan geçirilebilir kwargs olmalıdır obj_get
için
data = self.obj_get(None,pk=pkval)
parametreleri: https://github.com/toastdriven/django-tastypie/blob/master/tastypie/resources.py den ModelResource.obj_get ait tanımı
def obj_get(self, request=None, **kwargs):
"""
A ORM-specific implementation of ``obj_get``.
Takes optional ``kwargs``, which are used to narrow the query to find
the instance.
"""
try:
base_object_list = self.get_object_list(request).filter(**kwargs)
object_list = self.apply_authorization_limits(request, base_object_list)
stringified_kwargs = ', '.join(["%s=%s" % (k, v) for k, v in kwargs.items()])
if len(object_list) <= 0:
raise self._meta.object_class.DoesNotExist("Couldn't find an instance of '%s' which matched '%s'." % (self._meta.object_class.__name__, stringified_kwargs))
elif len(object_list) > 1:
raise MultipleObjectsReturned("More than '%s' matched '%s'." % (self._meta.object_class.__name__, stringified_kwargs))
return object_list[0]
except ValueError:
raise NotFound("Invalid resource lookup data provided (mismatched type).")
yukarıda ModelResource.obj_get kaynaklarını koymak .. değişmez ama bu daha kolay – dwarfy
A olduğunu düşünüyorum Bunu yapmanın daha temiz yolu, URL'yi tersine çevirirken API adını belirtmek, örn. 'url = reverse ('api_dispatch_list', kwargs = {'resource_name': 'myresource', 'api_name': 'v1'})'. Bu, API kök URL'nizi veya sürüm numaranızı değiştirirseniz kodun çalışmaya devam edeceği anlamına gelir. –
tamam teşekkürler, deneyeceğim ... – dwarfy