我正在尝试在 Django 中保存一个模型表单的实例。我已经设置了一个模板来输入信息到表单和一个视图来处理保存。表单验证正常,但在尝试保存时会生成外键不匹配错误。我在这里做错了什么?
我正在运行 Django 2.0.0。我已经尝试添加和删除 primary_key 选项而没有任何运气并删除我的 sqlite 数据库,清除所有 pycache,然后再次迁移。问题仍然存在。
#models.py
from django.db import models
import uuid
from users.models import Company, CustomUser
from delivery import settings
class Location(models.Model):
location_id = models.UUIDField(primary_key=True, default=uuid.uuid4, editable=False)
address = models.CharField(max_length = 120)
date_added = models.DateField(auto_now_add = True)
class Shipment(models.Model):
date_created = models.DateField(auto_now_add=True)
sender_company = models.ForeignKey(Company, on_delete = models.PROTECT, related_name='sender')
receiver_company = models.ForeignKey(Company, on_delete = models.PROTECT, related_name='receiver')
origin = models.ForeignKey(Location, on_delete = models.SET_DEFAULT, default = 'Location no longer active.', related_name='origin')
destination = models.ForeignKey(Location, on_delete = models.SET_DEFAULT, default = 'DESTINATION UNKNOWN', related_name='destination')
expected_arrival = models.DateField()
weight = models.FloatField()
current_handler = models.ForeignKey(settings.AUTH_USER_MODEL, on_delete = models.SET_DEFAULT, default = 'UNKNOWN')
shipment_id = models.UUIDField(unique=True, primary_key = True, default=uuid.uuid4, editable=False)
#forms.py
from django import forms
from .models import Location, Shipment
class LocationRegisterForm(forms.ModelForm):
class Meta:
model = Location
fields = '__all__'
class CreateShipment(forms.ModelForm):
class Meta:
model = Shipment
exclude = ['current_handler', 'shipment_id']
def clean_expected_arrival(self):
expected_arrival = self.cleaned_data['expected_arrival']
date_created = self.cleaned_data['date_created']
if expected_arrival < date_created:
raise ValidationError('Expected arrival date cannot be in the past.')
return expected_arrival
#views.py
from django.shortcuts import render, redirect
from .forms import CreateShipment, LocationRegisterForm
from users.permissions import group_required
@group_required('delivery_employee')
def new_shipment(request):
if request.method == 'POST':
form = CreateShipment(request.POST)
if form.is_valid():
temp_form = form.save(commit=False)
current_user = request.user
temp_form.current_handler = current_user
temp_form.save()
return redirect('dash-home')
else:
return render(request, 'shipments/new-shipment.html', {'form':form})
form = CreateShipment()
return render(request, 'shipments/new-shipment.html', {'form':form})
@group_required('delivery_employee')
def add_location(request):
if request.method == 'POST':
form = LocationRegisterForm(request.POST)
if form.is_valid():
form.save()
return redirect('new-shipment')
else:
return render(request, 'shipments/location-register.html', {'form':form})
form = LocationRegisterForm()
return render(request, 'shipments/location-register.html', {'form':form})
我收到错误消息:
File "C:\Python34\lib\site-packages\django\db\backends\sqlite3\base.py", line 303, in execute
return Database.Cursor.execute(self, query, params)
django.db.utils.OperationalError: foreign key mismatch - "shipments_shipment" referencing "shipments_location"
谢谢!
您的origin
和destination
字段将默认值设置为纯字符串,它们的默认值应该是默认的 Location 实例。
创建方法get_default_origin
,get_default_destination
如您将从数据库返回现有记录的位置。将这些方法分配给默认参数,例如
origin = models.ForeignKey(Location, on_delete = models.SET_DEFAULT, default=self.get_default_origin, related_name='origin')
destination = models.ForeignKey(Location, on_delete = models.SET_DEFAULT, default=self.get_default_destination, related_name='destination')
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句