Ошибка 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-запрос.

Вернуться на верх