#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, который вы создали? Извините, я, по-видимому, новичок в django4.
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’??