2

関連するテーブルの主キーを「指さない」外部キーを使用すると、ModelFormの保存に問題があります(レガシースキーマの問題)。外部キーにto_field =を使用して、キーに関連付けられるようにします。それは正確には鍵ではありません。私のModelForm外部キーは、デフォルトのレンダリングに2分かかるため、クエリセットとHiddenInput()のウィジェットでModelChoiceFieldを使用します。クエリセットが関連オブジェクト(チェックイン)を返すときにオプション値として主キーを返すため、保存しようとすると無効な選択が表示されます。この設定でModelChoiceFieldを引き続き使用するにはどうすればよいですか?以下の私の基本的なスキーマ。

class Checkin(models.Model):
    sampleid = models.CharField(unique=True, max_length=255, db_column='SampleID', primary_key=True)
    #shortsampleid is the field that is sometimes used as a sort of pk. 
    shortsampleid = models.IntegerField(unique=True, db_column='ShortSampleID') 
    company = models.CharField(max_length=765, db_column='Company', blank=True)
    ...

class Tblshipmentstore(models.Model):
    shortsampleid = models.ForeignKey(Checkin, to_field='shortsampleid', db_column='ShortSampleID')
    shipmentitem = models.CharField(max_length=765, db_column='ShipmentItem', blank=True)
    shipdate = models.DateField(null=True, db_column='ShipDate', blank=True)
    ...

class TblShipmentstoreForm(ModelForm):
    shortsampleid = forms.ModelChoiceField(queryset=Checkin.objects.all(), widget=forms.HiddenInput());

   class Meta:
       model = 'Tblshipmentstore'
4

1 に答える 1

4

ModelChoiceFieldには、to_field_name構築時に渡すことができる文書化されていないパラメーターがあり、主キーの代わりにそのフィールドを使用します。

これを使用したいようです(テストされていません):

shortsampleid = forms.ModelChoiceField(
    queryset=Checkin.objects.all(),
    to_field_name = 'shortsampleid',
    widget=forms.HiddenInput());
于 2011-08-29T20:20:23.407 に答える