1

問題の説明: Django admin を使用して多くのテーブルを管理していますが、その中には多対多の関係があるものもあります。多数のフィールドが定義されているテーブル (モデル) に新しいレコードを保存できません。追加フォームをうまくレンダリングできます。問題は、レコードを保存しようとしたときだけです。既存のレコードを更新する場合、同じ問題はありません。

以下のモデルを使用すると、次のエラーが表示されます: 'Bout' インスタンスは、多対多の関係を使用する前に主キーの値を持つ必要があります。

Bout モデルは Equipment モデルと多対多の関係にあります。BoutEquipment モデルは中間モデルです。

私はこの問題を StackOverflow と Google で詳細に調査しましたが、これまでのところ解決策を見つけることができません。

開示:私はDjangoが初めてで、Pythonが初めてです。この問題に対する比較的簡単な解決策があることを願っています。

前もって感謝します。

models.py

class Bout(models.Model):    
boutid = models.AutoField(db_column=u'BoutID', primary_key=True) 
sessionid = models.ForeignKey(Session, db_column=u'SessionID', verbose_name=u'Session') 
activitytypeid = models.ForeignKey(Activitytype, db_column=u'ActivityTypeID', verbose_name=u'Activity Type') 
locationid = models.ForeignKey(Location, db_column=u'LocationID',verbose_name=u'Location') 
equipment = models.ManyToManyField(Equipment, verbose_name=u'Related Equipment', related_name=u'Bout_Equipment', blank=True, null=True) #through = 'BoutEquipment'
intensitymetrics = models.ManyToManyField(Intensitymetric, verbose_name=u'Related Intensity Metrics', related_name=u'Bout_IntensityMetrics', blank=True, null=True) #through = 'BoutIntensitymetric'

def __unicode__(self):
    return u'%s %s' % (self.sessionid, self.activitytypeid)

class Meta:
    db_table = u'app_bout'
    verbose_name = u'Bout'
    verbose_name_plural = u'Bouts'

class Equipment(models.Model):
equipmentid = models.AutoField(db_column=u'EquipmentID', primary_key=True) 
name = models.CharField("Name", max_length=100, db_column=u'Name')
equipmenttypeid = models.ForeignKey(Equipmenttype, db_column=u'EquipmentTypeID', verbose_name = u'Equipment Type') 

def __unicode__(self):
    return self.name

class Meta:
    db_table = u'app_equipment'
    verbose_name = u'Equipment'
    verbose_name_plural = u'Equipment'

class BoutEquipment(models.Model):
id = models.AutoField(db_column=u'id', primary_key=True)
boutid = models.ForeignKey(Bout, db_column=u'Bout_ID') 
equipmentid = models.ForeignKey(Equipment, db_column=u'Equipment_ID') 

def __unicode__(self):
    return self.name

class Meta:
    db_table = u'app_bout_equipments'

admin.py

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')
          )
4

1 に答える 1