Вот упрощенная версия одной из моих моделей:
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)
Этот класс управляет правилом для импорта списка объектов от канала в базу данных.
Администраторская система не позволит мне добавить ImportRule, не выбирая feed_provider_category несмотря на него объявляемый в модели как nullable. База данных (SQLite в данный момент) даже проверяет хорошо:
>>> .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"),
);
...
Я могу создать объект в оболочке Python достаточно легко:
f = Feed.objects.get(pk=1)
i = ImportRule(name='test', feed=f)
i.save()
... но администраторская система не позволит мне отредактировать его, конечно. Как я могу заставить администратора позволять мне редактировать/создавать объекты, не указывая тот внешний ключ?
Как насчет blank = True
? Из документов Django :
Если
True
, поле может быть пустым. По умолчаниюНеверно
.
... хорошо, я узнал, как это сделать самостоятельно. Возможно, это не лучший способ, но я создал специальную форму для проверки модели:
class AdminImportRuleForm(forms.ModelForm):
class Meta:
model = ImportRule
name = forms.CharField(max_length=255)
feed = forms.ModelChoiceField(required=True, queryset=Feed.objects.all())
feed_provider_category = forms.ModelChoiceField(required=False, queryset=FeedProviderCategory.objects.all())
target_subcategories = forms.ModelMultipleChoiceField(queryset=Subcategory.objects.all())
И связал ее с классом Admin:
class ImportRuleAdmin(admin.ModelAdmin):
form = AdminImportRuleForm
...
Это потребовало много усилий и лишних хлопот, так что если у кого-то еще есть лучшее решение, они получают голосование / принимает / все, что он позволяет мне дать :)