Django:使用to_field和ModelChoiceForm使用Foreignkey保存Modelform

时间:2011-08-29 20:09:26

标签: django foreign-keys modelform

当使用不指向其相关表的主键的外键(遗留模式问题)时,我在保存ModelForm时遇到问题我使用to_field = for Foregin Key这样它就会相关一把钥匙不是一把钥匙。我的ModelForm foreignkey使用带有查询集的ModelChoiceField和HiddenInput()的小部件,因为默认呈现需要2分钟。当我尝试保存时,我得到一个无效的选择,因为queryset在返回相关对象(Checkin)时返回主键作为选项值。我如何仍然使用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'

1 个答案:

答案 0 :(得分:4)

ModelChoiceField有一个未记录的to_field_name参数,您可以在构造时传入该参数,这使得它使用该字段而不是主键。

听起来你想要使用它(未经测试):

shortsampleid = forms.ModelChoiceField(
    queryset=Checkin.objects.all(),
    to_field_name = 'shortsampleid',
    widget=forms.HiddenInput());