Django错误:无法指定"''":“”必须是“”示例

tzxcd3kk  于 2023-01-27  发布在  Go
关注(0)|答案(2)|浏览(110)

我在添加一对时收到此错误。
无法指定"'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)

我尝试通过链接添加配对,但收到此错误,可能是什么问题?

tjvv9vkg

tjvv9vkg1#

正如错误所指出的,您不能只传递“Exchange”模型的id,还必须传递模型的示例。
选项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/')

作为一个额外的好处,你可能想添加一些验证你收到的交换ID是正确的,例如你可以使用django的get_object_or_404

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/')
bvk5enib

bvk5enib2#

正如错误所述,您需要提供一个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标准。因此,最好将其转换为POST请求。

相关问题