2015-05-13 39 views
0

你好我創建了兩個模型,第二個必須先使用它,例如第一個模型是產品,第二個是包含少量產品的商店。Django如何添加外鍵 - 多選

from django.db import models 

# Create your models here. 


class Product(models.Model): 
    name = models.CharField("name", max_length=40) 
    price = models.FloatField("price") 

    def __unicode__(self): 
     return self.name 

class Shop(models.Model): 
    product = models.ForeignKey(Product, null = True) 
    name = models.CharField("shopname", max_length=40) 
    salary = models.FloatField("salary") 

    def __unicode__(self): 
     return self.name 

這是好的開始嗎?我想創造一些能夠給Shop.model增加許多Product.model的可能性。如何創建它?

而第二個問題是 - 現在,當我點擊

蟒蛇manage.py遷移homebudget

我有信息

(venv) C:\Users\noname\nowe\budget>python manage.py makemigrations homebudget 
Migrations for 'homebudget': 
    0011_auto_20150513_1817.py: 
    - Alter field price on product 
    - Alter field name on product 
    - Alter field name on shop 
    - Alter field salary on shop 

(venv) C:\Users\noname\nowe\budget>python manage.py migrate homebudget 
Operations to perform: 
    Apply all migrations: homebudget 
Running migrations: 
    Rendering model states... DONE 
    Applying homebudget.0002_shop_product...Traceback (most recent call las 
t): 
    File "manage.py", line 10, in <module> 
    execute_from_command_line(sys.argv) 
    File "C:\Users\noname\nowe\venv\lib\site-packages\django\core\management\__init_ 
_.py", line 338, in execute_from_command_line 
    utility.execute() 
    File "C:\Users\noname\nowe\venv\lib\site-packages\django\core\management\__init_ 
_.py", line 330, in execute 
    self.fetch_command(subcommand).run_from_argv(self.argv) 
    File "C:\Users\noname\nowe\venv\lib\site-packages\django\core\management\base.py 
", line 390, in run_from_argv 
    self.execute(*args, **cmd_options) 
    File "C:\Users\noname\nowe\venv\lib\site-packages\django\core\management\base.py 
", line 441, in execute 
    output = self.handle(*args, **options) 
    File "C:\Users\noname\nowe\venv\lib\site-packages\django\core\management\command 
s\migrate.py", line 221, in handle 
    executor.migrate(targets, plan, fake=fake, fake_initial=fake_initial) 
    File "C:\Users\noname\nowe\venv\lib\site-packages\django\db\migrations\executor. 
py", line 110, in migrate 
    self.apply_migration(states[migration], migration, fake=fake, fake_initial=f 
ake_initial) 
    File "C:\Users\noname\nowe\venv\lib\site-packages\django\db\migrations\executor. 
py", line 147, in apply_migration 
    state = migration.apply(state, schema_editor) 
    File "C:\Users\noname\nowe\venv\lib\site-packages\django\db\migrations\migration 
.py", line 115, in apply 
    operation.database_forwards(self.app_label, schema_editor, old_state, projec 
t_state) 
    File "C:\Users\noname\nowe\venv\lib\site-packages\django\db\migrations\operation 
s\fields.py", line 62, in database_forwards 
    field, 
    File "C:\Users\noname\nowe\venv\lib\site-packages\django\db\backends\sqlite3\sch 
ema.py", line 176, in add_field 
    self._remake_table(model, create_fields=[field]) 
    File "C:\Users\noname\nowe\venv\lib\site-packages\django\db\backends\sqlite3\sch 
ema.py", line 74, in _remake_table 
    self.effective_default(field) 
    File "C:\Users\noname\nowe\venv\lib\site-packages\django\db\backends\base\schema 
.py", line 194, in effective_default 
    default = field.get_default() 
    File "C:\Users\noname\nowe\venv\lib\site-packages\django\db\models\fields\relate 
d.py", line 1930, in get_default 
    if isinstance(field_default, self.rel.to): 
TypeError: isinstance() arg 2 must be a class, type, or tuple of classes and typ 
es 

(venv) C:\Users\noname\nowe\budget> 
+0

我想你會得到這個錯誤,因爲你傳遞一個字符串作爲模型字段的第一個參數。現場調用不需要。 – nofinator

+0

@nofinator不,這只是可選的詳細名稱,這是不必要的,但很好。 znawca請發佈完整的追溯。 –

+0

@DanielRoseman。糟糕,我的錯誤。謝謝。 – nofinator

回答

0

運行這段代碼並沒有給我任何錯誤,但它看起來像nofinator有一點,即字段調用不希望名稱作爲位置參數。如果你想他們來說,這可能會更好使用verbose_name例如,

salary = models.FloatField(verbose_name="salary") 

但是除非你用它來提供一個更可讀的名字它沒有很大的意義。

0

您可能想要使用不是外鍵的models.ManyToManyField。你現在寫的方式是Product可以有很多Shop s。

至少你想要Shop有很多Product s;在這種情況下,在該情況下在Product中具有ForeginKey

你需要寫verbose_name="salary"等來擺脫這個問題。