2015-05-13 38 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"等来摆脱这个问题。