Не удается назначить: должна быть ошибка внешнего ключа экземпляра Django

#python #django #django-models #orm #foreign-keys

#python #django #django-модели #orm #внешние ключи

Вопрос:

Я создал модель и подключил к ней внешний ключ, но когда я сохраняю их, я получаю сообщение об ошибке Не удается назначить «1»: «SupplierBidModel.Load_ID» должен быть экземпляром «ShipperBoardModel».

Я довольно новичок в Django и даже новее в концепции взаимосвязанных моделей Django. Есть идеи, почему это происходит?? Я понятия не имею, куда идти отсюда, поскольку в Google тоже не так много подобных вопросов.

Мой models.py

 class ShipperBoardModel(models.Model):
    # Manufaturer_ID
    LoadID = models.AutoField(primary_key=True)
    From = models.CharField(max_length=100,null=True)
    To = models.CharField(max_length=100,null=True)
    Type = models.CharField(max_length=100,null=True)
    Length = models.CharField(max_length=100,null=True)
    Weight = models.CharField(max_length=100,null=True)
    Numberoftrucks = models.IntegerField(null=True)
    MaterialType = models.CharField(null=True,max_length=100)
    Loadingtime = models.DateTimeField(null=True)
    # Loadkey = models.ForeignKey()

    def _str_(self):
        return self.Origin
#
class SupplierBidModel(models.Model):
    BidID = models.AutoField(primary_key=True)
    Load_ID = models.ForeignKey(ShipperBoardModel,on_delete=models.CASCADE,default=3)
    Supplier_ID = models.ForeignKey(SupplierBoardModel,on_delete=models.CASCADE,default=3)
    Bid_amount = models.IntegerField(null=True)

  class Meta:
      unique_together = ('Load_ID', 'Supplier_ID')
  

Views.py

 def suppliertablefun (request):  # function to display shipperboardmodel
    data = ShipperBoardModel.objects.all()

    if request.method == 'POST':
        forminput = BiddingForm(request.POST)
        if forminput.is_valid():
            forminput.save()

    forminput = BiddingForm(request.POST)
    return render(request, 'supplierboard/board.html', locals(), {'forminput': forminput})
  

PS: Я пытаюсь предварительно заполнить свою форму как таковую:

 <form action="" method="post">
  {# <input type="hidden" value={{item.LoadID}} name="Load_ID" /> #}
  <input type="hidden" value={{item.LoadID}} name="Load_ID" />
  {{ forminput.Bid_amount }}
  <input type="submit" class="btn btn-primary" value="Submit"/>
</form>
  

Я пытаюсь передать текущий LoadID в LoadID с помощью value = {{item.LoadID}} который выполняется, потому что в шаблоне как таковом есть цикл for :

 {% for item in data %}
  

Forms.py

 class BiddingForm(forms.ModelForm):
    Bid_amount = forms.IntegerField()
    Load_ID = forms.IntegerField(widget=forms.HiddenInput())
    class Meta:
        model = SupplierBidModel
        exclude = ()
  

Хорошо, я просто исправил эту ошибку, передав значение ={{LoadID}} вместо value={{item.LoadID}} и ошибки нет, но она ничего не сохраняет в базе данных. Что теперь делать?

Ответ №1:

Где-то в вашем коде вы пытаетесь присвоить число (1) SupplierBidModel.Load_ID , что неверно, потому что у вас есть следующее в вашем SupplierBidModel :

 Load_ID = models.ForeignKey(ShipperBoardModel,on_delete=models.CASCADE,default=3,related_name='load')
  

Если вы создаете, ShipperBidModel используя число для связывания ShipperBoardModel , то сначала вам нужно получить соответствующий объект, что-то вроде:

 # ... you get load_id from the form
shipper_board = ShipperBoardModel.objects.get(pk=load_id)
# then you create the SupplierBidModel instance, adding the other fields that you want
SupplierBidModel.objects.create(LoadId=shipper_board)
  

Ваш LoadId идентификатор не является, это ShipperBoardModel объект, поэтому вам нужно назначить соответствующий.

Ваше соглашение об именовании повсюду, поля модели должны быть в нижнем регистре, разделенные символами подчеркивания. Проверьте документы: Стиль модели

Комментарии:

1. Почему это?? почему я не могу передать строковое значение «1» в LoadID??? Кроме того, спасибо за предложение по соглашению об именовании.

2. Проверьте мою правку. Ваш LoadId не является числом, это внешний ключ для другой модели. Поэтому вы должны назначить ему экземпляр ShipperBoardModel .

3. О .. Я, конечно, этого не знал, так куда мне добавить эту строку objects.create для создания экземпляра? И что мне сделать, чтобы моя предварительно заполненная форма могла принимать значение из этого цикла for?? Кроме того, что это за shipper_board, который вы создали? Извините, я, по-видимому, новичок в django

4. shipper_board Это экземпляр ShipeprBoardModel, который вам нужно использовать в качестве LoadId, полученный идентификатор должен использоваться для получения правильного экземпляра в первую очередь, именование сбивает с толку. Это был просто пример, показывающий, как это должно работать. Ваша SupplierBidModel создается в каком-то месте, вот что вам нужно проверить.

5. Я добавил BiddingForm в вопрос, здесь ли я добавляю ваш код shipper_board = ShipperBoardModel.objects.get(pk=load_id) ?

Ответ №2:

ну, у вас какая-то проблема в модели

 class SupplierBidModel(models.Model):
    BidID = models.AutoField(primary_key=True)
    Load_ID = models.ForeignKey(ShipperBoardModel,on_delete=models.CASCADE,default=3,related_name='load')
    Supplier_ID = models.ForeignKey(SupplierBoardModel,on_delete=models.CASCADE,default=3,related_name='supplier')
    Bid_amount = models.IntegerField(null=True)
  

у вас не может быть более одного в одной модели. для этого вам нужен параметр related_name

Комментарии:

1. Я только что попробовал ваш код, он не сработал …. кстати, что здесь ‘load’ и ‘supplier’??