【问题标题】:Objects of model does not have primary key模型对象没有主键
【发布时间】:2022-10-07 08:48:44
【问题描述】:

不幸的是,我无法摆脱代码中发现的问题: 我创建了一个新模型来区分销售订单和采购订单。 问题是,当我创建相关对象时,绝不会识别主键。 通过管理部分,我创建了对象,但如果我尝试单击它,则无法识别它,也无法删除它。 通过 Robo 3T 我注意到与第一个模型的订单相比,第二个模型少了一个字段,即与 id 相关的字段。 有问题的模型实际上是相同的,但一个有效,另一个无效。

模型.py

from django.db import models
from django.contrib.auth.models import User
from django.conf import settings
from django.utils import timezone


class Profile(models.Model):
    user_profile=models.ForeignKey(User,on_delete=models.CASCADE)
    btc=models.IntegerField(default=5)
    usd=models.IntegerField(default=100000)
    initial_balance=models.IntegerField()

class Order(models.Model):
    profile=models.ForeignKey(User,on_delete=models.CASCADE)
    datetime=models.DateTimeField(default=timezone.now())
    price=models.FloatField()
    quantity=models.FloatField()

class SellOrder(models.Model):
    buyer_profile=models.ForeignKey(User,on_delete=models.CASCADE)
    buyer_datetime=models.DateTimeField(default=timezone.now())
    buyer_price=models.FloatField()
    buyer_quantity=models.FloatField()

视图.py

from django.shortcuts import render,redirect,get_object_or_404
from django.contrib.auth import authenticate,login,logout
from django.contrib.auth.forms import UserCreationForm
from django.contrib import messages
from .models import Profile,Order, SellOrder
from django.views.decorators.csrf import csrf_exempt
from .forms import OrderForm, SellOrderForm
import requests


def home_page(request):
    price=get_price()
    return render(request,\'app/home_page.html\',{\'price\':price})

@csrf_exempt
def register_user(request):
    price=get_price()
    if request.method==\'POST\':
        form=UserCreationForm(request.POST)
        if form.is_valid():
            form.save()
            username=form.cleaned_data[\'username\']
            password=form.cleaned_data[\'password1\']
            user=authenticate(username=username,password=password)
            login(request,user)
            messages.success(request,\"Registration Successful!\")
            profile=Profile()
            profile.user_profile=request.user
            profile.initial_balance=100000+(price*5)
            profile.save()
            return redirect(\'profile\')
    else:
        form=UserCreationForm()
    return render(request,\'app/register_user.html\',{\'form\':form,\'price\':price})


def logout_user(request):
    logout(request)
    messages.success(request, \"You were logged out!\")
    return redirect(\"home_page\")

@csrf_exempt
def login_user(request):
    price=get_price()
    if request.method==\"POST\":
        username=request.POST[\'username\']
        password=request.POST[\'password\']
        user=authenticate(request,username=username,password=password)
        if user is not None:
            login(request,user)
            return redirect(\'profile\')
        else:
            messages.success(request,\'There was an error logging in, try again...\')
            return render(request,\'app/login_user.html\',{\'price\':price})
    else:
        return render(request,\'app/login_user.html\',{\'price\':price})

def personal_profile(request):
    price = get_price()
    profile=Profile.objects.get(user_profile=request.user)
    return render(request,\'app/logged_in.html\',{\'username\':profile.user_profile,\'btc\':profile.btc,\'price\':price,\'usd\':profile.usd})

def publish_order(request):
    price = get_price()
    if request.method==\"POST\":
        form=OrderForm(request.POST)
        if form.is_valid():
            order=form.save(commit=False)
            profile=Profile.objects.get(user_profile=request.user)
            if (profile.btc-order.quantity)>=0:
                profile.btc-=order.quantity
                order.profile = request.user
                order.save()
                profile.save()
                messages.success(request, \'Offer published!\')
                return redirect(\'profile\')
            else:
                messages.success(request, \'You dont have enough bitcoins!\')
                return redirect(\'profile\')
    else:
        form=OrderForm()
    return render(request,\'app/new_order.html\',{\'form\':form,\'price\':price})

def orders_list(request):
    price = get_price()
    orders=Order.objects.all()
    sellorders=SellOrder.objects.all()
    return render(request,\'app/orders_list.html\',{\'orders\':orders,\'price\':price,\'sellorders\':sellorders})

def order_details(request,pk):
    price = get_price()
    order=get_object_or_404(Order,pk=pk)
    return render(request,\'app/order_details.html\',{\'order\':order,\'price\':price})

def purchase(request,pk):
    price = get_price()
    buyer_profile=Profile.objects.get(user_profile=request.user)
    order=Order.objects.get(pk=pk)
    seller_profile=Profile.objects.get(user_profile=order.profile)
    if buyer_profile.usd >= order.price:
        buyer_profile.btc+=order.quantity
        buyer_profile.usd -= order.price
        seller_profile.usd+=order.price
        buyer_profile.save()
        seller_profile.save()
        order.delete()
    else:
        messages.success(request,\'Ops! You dont have enough money...\')
        return redirect(\'profile\')
    return render(request,\'app/purchase.html\',{\'quantity\':order.quantity,\'seller\':seller_profile.user_profile,\'price\':price})

URL=\"https://min-api.cryptocompare.com/data/price?fsym=BTC&tsyms=USD\"

def get_price():
    try:
        response=requests.get(URL.format()).json()
        a=int(response[\'USD\'])
        return a
    except:
        return False

def analytics(request):
    price=get_price()
    profile=Profile.objects.get(user_profile=request.user)
    initial_balance=profile.initial_balance
    actual_balance=profile.usd+(profile.btc*price)
    total_gain=actual_balance-initial_balance
    return render(request,\'app/analytics.html\',{\'initial_balance\':initial_balance,\'actual_balance\':actual_balance,\'gain\':total_gain,\'price\':price})

def publish_buy_order(request):
    price = get_price()
    if request.method==\"POST\":
        form=SellOrderForm(request.POST)
        if form.is_valid():
            order=form.save(commit=False)
            profile=Profile.objects.get(user_profile=request.user)
            if (profile.usd-order.price)>=0:
                profile.usd-=order.price
                order.buyer_profile = request.user
                order.save()
                profile.save()
                messages.success(request, \'Offer published!\')
                return redirect(\'profile\')
            else:
                messages.success(request, \'Ops. There is an error... Try again.\')
                return redirect(\'profile\')
    else:
        form=OrderForm()
    return render(request,\'app/new_order.html\',{\'form\':form,\'price\':price})

def sell(request,pk):
    price = get_price()
    seller_profile=Profile.objects.get(user_profile=request.user)
    order=SellOrder.objects.get(pk=pk)
    buyer_profile=Profile.objects.get(user_profile=order.buyer_profile)
    if seller_profile.btc >= order.quantity:
        seller_profile.btc-=order.quantity
        buyer_profile.btc+=order.quantity
        seller_profile.usd+=order.price
        buyer_profile.save()
        seller_profile.save()
        order.delete()
    else:
        messages.success(request,\'Ops! You dont have enough BTC...\')
        return redirect(\'profile\')
    return render(request,\'app/sell.html\',{\'quantity\':order.quantity,\'buyer\':buyer_profile.user_profile,\'price\':price})

def buy_order_details(request,pk):
    price = get_price()
    order=get_object_or_404(SellOrder,pk=pk)
    return render(request,\'app/buy_order_details.html\',{\'order\':order,\'price\':price})

    标签: python django django-models django-views


    【解决方案1】:

    我可能错了,但是。在我的 Django 项目模型创建开始期间,我在迁移方面遇到了很多困难。由于主键应该由 Django 自动实例化,如果创建了 fields['id'],我建议您首先检查您的迁移。

    这是它应该是什么样子的示例:

    migrations.CreateModel(
                name='Post',
                fields=[
                    ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
                    ('title', models.CharField(max_length=200, unique=True)),
                    ('content', models.TextField()),
                ],
            ),
    

    如果该字段丢失,您可以重新运行迁移并希望它被添加或者只是自己编写丢失的行。

    【讨论】:

    • 我在哪里可以找到这个?迁移是什么意思,哪个文件。
    • @ClaudioFanzini。迁移是在导出模型以在数据库中创建表时创建的文件。它们包含在名为 Migrations 的目录中,为避免出现任何问题,我建议您删除所有迁移,然后再次迁移
    猜你喜欢
    • 2018-09-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-01-14
    • 2019-05-09
    • 2021-04-11
    相关资源
    最近更新 更多