为什么django管理员不接受Nullable外键?

p.g*_*all 16 nullable foreign-keys django-admin

这是我的一个模型的简化版本:

class ImportRule(models.Model):
  feed = models.ForeignKey(Feed)
  name = models.CharField(max_length=255)
  feed_provider_category = models.ForeignKey(FeedProviderCategory, null=True)
  target_subcategories = models.ManyToManyField(Subcategory)
Run Code Online (Sandbox Code Playgroud)

此类管理用于将项目列表从订阅源导入数据库的规则.

尽管管理系统在模型中声明为可空,但管理员系统不会在不选择feed_provider_category的情况下添加ImportRule.数据库(SQLite目前)甚至检查出ok:

>>> .schema
...
CREATE TABLE "someapp_importrule" (
  "id" integer NOT NULL PRIMARY KEY,
  "feed_id" integer NOT NULL REFERENCES "someapp_feed" ("id"),
  "name" varchar(255) NOT NULL,
  "feed_provider_category_id" integer REFERENCES "someapp_feedprovidercategory" ("id"),
);
...
Run Code Online (Sandbox Code Playgroud)

我可以很容易地在python shell中创建对象:

f = Feed.objects.get(pk=1)
i = ImportRule(name='test', feed=f)
i.save()
Run Code Online (Sandbox Code Playgroud)

...当然,管理系统不会让我编辑它.如何让管理员让我编辑/创建对象而不指定该外键?

jho*_*ter 38

如何空白=真?来自Django的文档:

如果字段为空= True,则在Django的管理站点上进行验证将允许输入空值.如果字段为空= False,则将需要该字段.

  • `null = True`适用于模型(数据库),而`blank = True`适用于表单.表单还有另一种选择:`editable = False` (4认同)
  • 那很有效.我认为如果它不是CharField则null = True就足够了,而且blank = True是特定于CharField的.看起来我错了. (3认同)

小智 5

你应该尝试添加null = True,就像这样:

car = models.ForeignKey(Car, default=None, null=True, blank=True)
Run Code Online (Sandbox Code Playgroud)