2013-08-16 27 views
0

今天我一直在遇到這個問題一段時間,一個永久的解決方案將有所幫助。TypeError:對象不可迭代 - Django創建/獲取

我有一個供應商對象定義爲

class Vendors(models.Model): 
    vendor_id = models.IntegerField(primary_key=True) 
    vendor_name = models.CharField(max_length=50L) 
    demo_vendor = models.IntegerField() 
    url = models.CharField(max_length = 100L, null = True) 
    logo = models.CharField(max_length = 100L, null = True) 
    date_created = models.DateTimeField() 
    class Meta: 
    db_table = 'txn_vendors' 

在視圖中,我實施形式,以允許與更新現有沿創建新的供應商。爲此,我必須實現一個getVendorData方法,該方法需要在發送到客戶端之前序列化JSON中的數據。

serialized = serializers.serialize("json", Vendors.objects.filter(vendor_id = incomingData["id"])) 

在這個觀點,如果我在的地方get使用filter,我沒有得到一個TypeError : Vendors is not iterable消息。

爲了實現創建並在一個方法更新功能,我寫

def saveVendorData(request): 
    incomingData = simplejson.loads(request.POST.get("data", None)) 

    if incomingData is not None: 
    vendor = None 
    newVendor = False 

    if incomingData["id"] == "": 
     vendor = Vendors.objects.create(vendor_name = incomingData["vendor_name"], demo_vendor = False, date_created = datetime.now(), url = incomingData["vendor_url"], logo = None) 
     newVendor = True 
    else: 
     vendor = Vendors.objects.get(vendor_id = incomingData["id"]) 
     vendor.vendor_name = incomingData["vendor_name"] 
     vendor.url = incomingData["vendor_url"] 

     vendor.save() 

    serialized = serializers.serialize("json", vendor) 

    return HttpResponse(simplejson.dumps({"success" : "true", "new_vendor" : newVendor, "data" : serialized}), mimetype = "application/json") 

    else: 
    return HttpResponse(simplejson.dumps({"success" : "false", "message" : "Issue with data reception in server"})) 

當我嘗試創建一個新的供應商提供有效的數據對象,我得到的TypeError響應上面詳細描述,並生成該堆棧跟蹤:

Vendor Data: [{"pk": 5, "model": "app.vendors", "fields": {"url": "nurturing seniors", "demo_vendor": 1, "vendor_name": "NURTURING SENIORS", "date_created": null, "logo": null}}] 
[15/Aug/2013 20:38:01] "POST /getVendorData/ HTTP/1.1" 200 218 

Internal Server Error: /saveVendorData/ 

Traceback (most recent call last): 
File "/usr/local/lib/python2.7/dist-packages/django/core/handlers/base.py", line 115, in get_response 
response = callback(request, *callback_args, **callback_kwargs) 

File "/media/Storage/code_projects/Rowdmap_Uboat/app/taxonomy_views.py", line 272, in saveVendorData 
serialized = serializers.serialize("json", vendor) 

File "/usr/local/lib/python2.7/dist-packages/django/core/serializers/__init__.py", line 99, in serialize 
s.serialize(queryset, **options) 

File "/usr/local/lib/python2.7/dist-packages/django/core/serializers/base.py", line 42, in serialize 
for obj in queryset: 

TypeError: 'Vendors' object is not iterable 

我需要將此數據發送到客戶端,因爲創建新的供應商記錄會導致在視圖中的多個位置插入新的HTML元素。

回答

3

發生此錯誤的原因是serialize方法的第二個參數是QuerySet。 見here

get返回型號instande,但filter返回一個QuerySet

The arguments to the serialize function are the format to serialize the data to (see Serialization formats) and a QuerySet to serialize.

你可以寫類似:

serialized = serializers.serialize("json", [vendor]) 
相關問題