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

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

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

Мои модели.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, используя значение = {{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}}, и ошибки нет, но она ничего не сохраняет в базу данных. Что теперь делать?

Ответы [ 2 ]

1 голос
/ 29 марта 2019

Где-то в вашем коде вы пытаетесь присвоить число (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 object, поэтому вам нужно назначить соответствующий.

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

1 голос
/ 29 марта 2019

ну, у вас есть проблемы в модели

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

...