Ошибка Django: Невозможно присвоить "''": "" должен быть экземпляром ""
Я получаю эту ошибку при добавлении пары.
Невозможно присвоить значение "'1'": "Pair.exchange" должен быть экземпляром "Exchange".
.
models.py:
class Exchange(models.Model):
name = models.CharField(max_length=25)
def __str__(self) -> str:
return f'{self.name}'
class Pair(models.Model):
symbol = models.CharField(max_length=20)
ask = models.FloatField()
bid = models.FloatField()
exchange = models.ForeignKey(Exchange, on_delete=models.PROTECT)
created = models.DateTimeField()
def __str__(self) -> str:
return f'ID: {self.id} Symbol: {self.symbol} Ask: {self.ask} Bid: {self.bid} Exchange: {self.exchange}'
views.py:
def show_pair(request):
pairs = Pair.objects.all()
br = [str(pair) + '<br>' for pair in pairs]
return HttpResponse(br)
def add_pair(request, symbol, ask, bid, exchange):
pair = Pair.objects.create(symbol=symbol, ask=ask, bid=bid, exchange=exchange)
return HttpResponsePermanentRedirect('/pair/')
urls.py:
path('pair/add/<symbol>/<ask>/<bid>/<exchange>/', views.add_pair)
Я пытаюсь добавить пары через ссылку, но получаю эту ошибку, в чем может быть проблема?
Как гласит ошибка, вы не можете просто передать id модели "Exchange", но вы должны передать экземпляр модели.
Вариант 1: Получить экземпляр модели и передать его
def add_pair(request, symbol, ask, bid, exchange):
exchange_obj = Exchange.objects.get(id=exchange)
pair = Pair.objects.create(symbol=symbol, ask=ask, bid=bid, exchange=exchange_obj)
return HttpResponsePermanentRedirect('/pair/')
Вариант 2: Когда вы создаете поле ForeignKey
в вашей модели, django фактически создает колонку базы данных под названием exchange_id
, так что вы также можете использовать ее для создания вашей "пары".
def add_pair(request, symbol, ask, bid, exchange):
pair = Pair.objects.create(symbol=symbol, ask=ask, bid=bid, exchange_id=exchange)
return HttpResponsePermanentRedirect('/pair/')
В качестве бонуса вы можете добавить некоторую проверку того, что получаемый вами идентификатор обмена действительно правильный. Вы можете использовать для этого, например, get_object_or_404
от django.
def add_pair(request, symbol, ask, bid, exchange):
exchange_obj = get_object_or_404(Exchange.objects.all(), id=exchange)
pair = Pair.objects.create(symbol=symbol, ask=ask, bid=bid, exchange=exchange_obj)
return HttpResponsePermanentRedirect('/pair/')
Как говорит ошибка, необходимо предоставить объект Exchange
, но эффективнее передать exhange_id
напрямую:
from django.shortcuts import redirect
from django.views.decorators.http import require_http_methods
@require_POST
def add_pair(request, symbol, ask, bid, exchange):
pair = Pair.objects.create(
symbol=symbol, ask=ask, bid=bid, exchange_id=exchange_id
)
return redirect('/pair/')
Вероятно, вам следует неработать с постоянным редиректом, поскольку в этом случае браузер в следующий раз никогда не запустит логику, а посетит редирект напрямую.
Примечание: GET запрос не должен иметь боковые эффекты, поэтому конструирование объектов, когда пользователь делает GET запрос, не соответствует требованиям HTTP. объектов, когда пользователь делает GET-запрос, не соответствует стандарту HTTP стандарту HTTP. Поэтому было бы лучше превратить этот запрос в POST-запрос.