Django: Сохранить модель с помощью Foreignkey, используя to_field и ModelChoiceForm - PullRequest
2 голосов
/ 30 августа 2011

У меня проблема с сохранением ModelForm при использовании внешнего ключа, который не "указывает" на первичный ключ его связанной таблицы (проблемы устаревшей схемы). Я использую to_field = для своего ключа Foregin, чтобы он былк ключу, который не совсем ключ.Мой ForeignForm ModelForm использует ModelChoiceField с набором запросов и виджетом HiddenInput (), потому что рендеринг по умолчанию занимает 2 минуты.Я получаю неверный выбор при попытке сохранить, потому что набор запросов возвращает первичный ключ в качестве значения параметра при возврате связанного объекта (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 Ответ

4 голосов
/ 30 августа 2011

ModelChoiceField имеет недокументированный параметр to_field_name, который можно передать во время построения, что заставляет его использовать это поле вместо первичного ключа.

Звучит так, как будто вы хотите использовать это (не проверено):

shortsampleid = forms.ModelChoiceField(
    queryset=Checkin.objects.all(),
    to_field_name = 'shortsampleid',
    widget=forms.HiddenInput());
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...