Django admin使用M2M字段保存新记录时遇到问题-在使用多对多关系之前,实例需要具有主键值

Django admin使用M2M字段保存新记录时遇到问题-在使用多对多关系之前,实例需要具有主键值,django,django-admin,django-orm,Django,Django Admin,Django Orm,问题陈述: 我使用Django admin来管理许多表,其中一些表具有多对多关系。我无法在定义了许多字段的表(模型)中保存新记录。我能够把add表单渲染得很好。只有在试图保存记录时才会出现问题。在更新现有记录时,我没有相同的问题 使用下面的模型,我收到以下错误:“Bout”实例需要有一个主键值,才能使用多对多关系 布特模型与设备模型存在多对多关系。BoutEquipment模型是中间模型 我已经在StackOverflow和Google上对这个问题进行了深入的研究,但到目前为止还没有找到解决方案

问题陈述: 我使用Django admin来管理许多表,其中一些表具有多对多关系。我无法在定义了许多字段的表(模型)中保存新记录。我能够把add表单渲染得很好。只有在试图保存记录时才会出现问题。在更新现有记录时,我没有相同的问题

使用下面的模型,我收到以下错误:“Bout”实例需要有一个主键值,才能使用多对多关系

布特模型与设备模型存在多对多关系。BoutEquipment模型是中间模型

我已经在StackOverflow和Google上对这个问题进行了深入的研究,但到目前为止还没有找到解决方案

披露:我是Django新手,Python新手。我希望这个问题有一个相对简单的解决方案

提前谢谢

型号.py admin.py
django中的
manytomany
字段是要相互连接的两个模型之间的连接表

这发生在SQL级别,因此这两个模型都必须存在于数据库中

bout = Bout()
...

equipment = Equipment()
...

bout.equipment.add(equipment)
#fails because bout and equipment are not saved

bout.save()
bout.equipment.add(equipment)
#fails because equipment is not saved

equipment.save()
bout.equipment.add(equipment)
#yay :)

谢谢你的回复,@Jay。我想我从概念上理解了这个问题。我正在努力实现。我是否在模型级别重写save方法?我在Bout模型级别尝试了以下代码。def save(self):b=Bout()e=Equipment()e.save()b.Equipment.add(e)b.save()‘code’对不起。出于某种原因,我似乎无法在上面的注释中清晰地嵌入save方法代码。
class EquipmentAdmin(admin.ModelAdmin):
form = EquipmentForm
inlines = [EquipmentShoeInline, EquipmentLogInline]
list_display = ('name','equipmenttypeid','manufacturer','retired','retiredby','retiredon','notes')
fields = (
          'name',
          ('equipmenttypeid','manufacturer'),
          ('retired','retiredby','retiredon'),
          'notes'
          )
class BoutAdmin(admin.ModelAdmin):
form = BoutForm
filter_horizontal = ('equipment','intensitymetrics',)
list_display = ('sessionid','activitytypeid','locationid','sequence','activehand','baddata')
inlines = [BoutDeviceInline,]
fields = (
          ('sessionid','locationid','activitytypeid'),
          'videofilelocation',
          'sequence',
          'activehand',
          'notes',
          'baddata',
          ('equipment','intensitymetrics')
          )
bout = Bout()
...

equipment = Equipment()
...

bout.equipment.add(equipment)
#fails because bout and equipment are not saved

bout.save()
bout.equipment.add(equipment)
#fails because equipment is not saved

equipment.save()
bout.equipment.add(equipment)
#yay :)