Я думаю, что ответ Asa чрезвычайно корректен, но Вы могли расширить его немного для действия больше как mkdir -p
, также:
import os
def mkdir_path(path):
if not os.access(path, os.F_OK):
os.mkdirs(path)
или
import os
import errno
def mkdir_path(path):
try:
os.mkdirs(path)
except os.error, e:
if e.errno != errno.EEXIST:
raise
они оба обрабатывают случай, где путь уже существует тихо, но позвольте другому ошибочному пузырю.
Обходной путь, который я нашел, заключался в следовании инструкциям для ManyToManyFields с промежуточными моделями . Даже если вы не используете функцию «сквозной» модели, просто сделайте вид, будто вы ее используете, и создайте модель-заглушку с необходимым иностранным ключом.
# models: make sure the naming convention matches what ManyToManyField would create
class Report_LocationGroups(models.Model):
locationgroup = models.ForeignKey(LocationGroup)
report = models.ForeignKey(Report)
# admin
class ReportInline(admin.TabularInline):
model = models.Report_LocationGroups
class LocationGroupAdmin(admin.ModelAdmin):
inlines = ReportInline,
Я думаю, вы можете объединить этот пример кода ( исходный код ), который нарушает sync_db
class ItemType(meta.Model):
name = meta.CharField(maxlength=100)
description = meta.CharField(maxlength=250)
properties = meta.ManyToManyField('PropertyType',
db_table='app_propertytype_itemtypes')
class PropertyType(meta.Model):
name = meta.CharField(maxlength=100)
itemtypes = meta.ManyToManyField(ItemType)
, с этим фрагментом
class ManyToManyField_NoSyncdb(models.ManyToManyField):
def __init__(self, *args, **kwargs):
super(ManyToManyField_NoSyncdb, self).__init__(*args, **kwargs)
self.creates_table = False
, чтобы получить что-то вроде
class ItemType(meta.Model):
name = meta.CharField(maxlength=100)
description = meta.CharField(maxlength=250)
properties = meta.ManyToManyField_NoSyncdb('PropertyType',
db_table='app_propertytype_itemtypes')
class PropertyType(meta.Model):
name = meta.CharField(maxlength=100)
itemtypes = meta.ManyToManyField(ItemType)
Отказ от ответственности : это всего лишь приблизительная идея
Изменить: Вероятно, есть какое-то отношение к прокси-моделям Django 1.1
Я думаю, что вы ищете встроенные строки администратора . В свой admin.py вы захотите добавить что-то вроде этого:
class LocationGroupInline(admin.TabularInline):
model = LocationGroup
class ReportAdmin(admin.ModelAdmin):
inlines = [ LocationGroupInline, ]
admin.site.register(Report, ReportAdmin)
admin.site.register(LocationGroup)
Есть много опций, которые нужно включить в LocationGroupInline, если вы хотите дополнительно настроить встроенное отображение связанной модели. Двумя из этих опций являются форма и набор форм , которые позволят вам использовать пользовательские классы Django Form и FormSet для дальнейшей настройки внешнего вида встроенного администратора модели. Используя это, вы можете создать простую форму, которая отображает только нужное вам поле с множественным выбором (за исключением поля M2M, его нельзя будет отобразить в виде одного раскрывающегося списка, а в виде поля с множественным выбором). Например:
class MyLocationGroupForm(forms.Form):
location = forms.MultipleModelChoiceField(
queryset=LocationGroup.objects.all())
class LocationGroupInline(admin.TabularInline):
model = LocationGroup
form = MyLocationGroupForm