2015-07-10 17 views
5

İşte benim models.py var:TypeError: int() bağımsız değişken bir dize veya bir sayı olmalıdır değil 'Modeli Örneği'

from django.db import models 

class Location(models.Model): 
    location_name = models.CharField(max_length=100) 
    def __unicode__(self): 
     return self.location_name 

class Menu(models.Model): 
    location = models.ManyToManyField(Location) 
    restaurant_name = models.CharField(max_length=200) 
    dish_category = models.CharField(max_length=100) 
    dish_name = models.CharField(max_length=200) 
    VNV_tag = models.CharField(max_length=100) 
    quantity = models.CharField(max_length=10, default='FULL') 
    price = models.CharField(max_length=5, default=0) 
    def __unicode__(self): 
     return self.restaurant_name 

Ben xlrd kullanarak bir excel dosyasından benim veritabanı doldurmak çalışıyorum python modülü. Ben populate_db.py senaryoyu çalıştırdığınızda

import os 
import xlrd 
from menusearch.models import Menu, Location 
os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'midnitepro.settings') 
import django 
django.setup() 

def populate(): 
    book = xlrd.open_workbook('/Users/Sahil/Desktop/MNFP1.xlsx') 
    sheet = book.sheet_by_index(0) 
    count1 = 0 
    while count1<sheet.nrows: 
     value_list = [] 
     count2 = 0 
     while count2<sheet.ncols: 
      value_list.append(sheet.row_values(count1, start_colx=count2, end_colx=count2+1)) 
      count2 +=1 
     add_menuitem(value_list) 
     count1 += 1 

def add_menuitem(value_list): 
    split_query = [] 
    m = Menu.objects.create() 
    value_list = [str(x[0]).encode('utf-8') for x in value_list if x] 

    m.restaurant_name = (value_list[0]) 
    m.dish_category = (value_list[1]) 
    m.dish_name = (value_list[2]) 
    m.VNV_tag = (value_list[3]) 
    m.quantity = (value_list[4]) 
    m.price = (value_list[5]) 
    # m.location.add(int(value_list[6])) 

    split_query = (value_list[6]).split(",") 
    for sq in split_query: 
     l = Location.objects.get_or_create(location_name=sq) 
     try: 
      m.location.add(l) 
     except ValueError: 
      print "Problem Adding Location to Menu." 

    m.save() 

if __name__ == '__main__': 
    print "Starting population script..." 
    from menusearch.models import Menu, Location 
    populate() 

Şimdi, terminalde çıkış okur: "Menü Konum Ekleme Sorun." İşte benim populate_db.py senaryo. Benim traceback okur hariç/denemek çıkardıktan sonra https://docs.djangoproject.com/en/1.8/topics/db/examples/many_to_many/

: Sorun populate_db komut burada var olduğunu görüyoruz: m.location.add (l) Ama Bu sorgu burada verilen söz dizimi ile uyumludur :

TypeError: int() argument must be a string or a number, not 'Location' 

Lütfen burada neler olduğunu açıklayın. Ve bir queryset aracılığıyla ManyToManyField için bir değer doğru bir şekilde nasıl eklenir.

Olası kopya: Django Error: TypeError: int() argument must be a string or a number, not 'BuildsTable' Yine de ManyToManyField kullandığım için durumumdaki cevabı bilmek istiyorum.

Tam geri izleme:

l= (<Location: Indiranagar>, False) 

Inside Loop - sq= Indiranagar 
Traceback (most recent call last): 
    File "populate_db.py", line 62, in <module> 
populate() 
    File "populate_db.py", line 23, in populate 
add_menuitem(value_list) 
    File "populate_db.py", line 50, in add_menuitem 
m.location.add(l) 
    File "/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/site-packages/django/db/models/fields/related.py", line 973, in add 
self._add_items(self.source_field_name, self.target_field_name, *objs) 
    File "/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/site-packages/django/db/models/fields/related.py", line 1079, in _add_items 
'%s__in' % target_field_name: new_ids, 
    File "/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/site-packages/django/db/models/query.py", line 679, in filter 
return self._filter_or_exclude(False, *args, **kwargs) 
    File "/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/site-packages/django/db/models/query.py", line 697, in _filter_or_exclude 
clone.query.add_q(Q(*args, **kwargs)) 
    File "/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/site-packages/django/db/models/sql/query.py", line 1304, in add_q 
clause, require_inner = self._add_q(where_part, self.used_aliases) 
    File "/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/site-packages/django/db/models/sql/query.py", line 1332, in _add_q 
allow_joins=allow_joins, split_subq=split_subq, 
    File "/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/site-packages/django/db/models/sql/query.py", line 1194, in build_filter 
lookups, value) 
    File "/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/site-packages/django/db/models/fields/related.py", line 1745, in get_lookup_constraint 
root_constraint.add(lookup_class(targets[0].get_col(alias, sources[0]), value), AND) 
    File "/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/site-packages/django/db/models/lookups.py", line 96, in __init__ 
self.rhs = self.get_prep_lookup() 
    File "/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/site-packages/django/db/models/lookups.py", line 134, in get_prep_lookup 
return self.lhs.output_field.get_prep_lookup(self.lookup_name, self.rhs) 
    File "/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/site-packages/django/db/models/fields/__init__.py", line 729, in get_prep_lookup 
return [self.get_prep_value(v) for v in value] 
    File "/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/site-packages/django/db/models/fields/__init__.py", line 985, in get_prep_value 
return int(value) 
TypeError: int() argument must be a string or a number, not 'Location'. 
+1

Lütfen tam geri izlemeyi gösterin. Eğer burada deneyin/çıkarmayı kaldırırsanız, bir tuple ile ilgili bir hata görmeyi beklerim, çünkü 'get_or_create'' döndürür (örnek, yaratılmış). –

+0

Evet, tamam. – vanguard69

+0

** l = (, Yanlış) ** Bu, get_or_create * – vanguard69

cevap

4

bir ManyToManyField bir değer eklemek için, argüman olarak ileterek nesneleri eklemeniz gerekir.

add(obj1, obj2, obj3, ...) 

Bu, belirtilen nesneleri ilgili nesne grubuna ekler.

Arayabilirsiniz add() aşağıda gibi: Sen get_or_create olarak endeks 0 tarafından instance erişmesi gereken

l = Location.objects.get_or_create(location_name=sq)[0] 

bir döndürür:

Senin durumunda
menu_object.location.add(loc_obj1, loc_obj2, ...) 

, yapmanız gereken tuple (instance, created). Ardından bu instance'u add() yöntemine geçirin.

Not:
her nesne için herhangi .save() diyoruz, daha ziyade .bulk_create() kullanarak ilişkileri oluşturmayacaktır bir çok-çok ilişkisi olan add() kullanma.

+0

çıktısıdır. Bu tam olarak ne yapıyorum. Çalışmıyor. – vanguard69

+0

Yapıyorsunuz m.location.add (int (value_list [6])) '. Whats 'value_list [6]'? Konum nesnesi –

+1

mu? Bu ifade bir yorumdur. Yaptığım şey bu değil. Diğer taraftan şunu deniyorum: 'm.location.add (l)' Burada 'l = Konum.objects.get_or_create (location_name = sq)' – vanguard69

2

Rahul Gupta'nın bunu şimdiden yanıtladığını anlıyorum.Ancak daha teorik düzeyde Burada get_or_create kullandığınızda olan buydu düşünüyorum:

l = Location.objects.get_or_create(location_name=sq) 

Bir Tuple verir ve dolayısıyla sen bunu değiştirerek ilk element aramak zorunda:

l = Location.objects.get_or_create(location_name=sq)[0] 

Sadece tuple/sözlükteki endeks elemanını döndürür!

+1

Yup. Katılıyorum. Bu tam olarak ne oluyor. – vanguard69