Python 为什么在django 3.1.10上创建的模型函数不';你不能在3.2上工作吗?
我在django 3.1.10中创建了一个代理模型,我在其中定义了一个函数,通过外键创建一个对象及其所有相关对象的副本,它工作得很好,但当我升级到django 3.2时,该函数只创建一个对象的副本,没有任何相关对象Python 为什么在django 3.1.10上创建的模型函数不';你不能在3.2上工作吗?,python,django,Python,Django,我在django 3.1.10中创建了一个代理模型,我在其中定义了一个函数,通过外键创建一个对象及其所有相关对象的副本,它工作得很好,但当我升级到django 3.2时,该函数只创建一个对象的副本,没有任何相关对象 from django.db import models from django.utils import timezone from django.contrib.auth.models import User from ValPlanner.models import Progr
from django.db import models
from django.utils import timezone
from django.contrib.auth.models import User
from ValPlanner.models import ProgramExecution
import datetime
from django.utils import timezone
#-----------------------------------------------------------------------------------------------------------------------------
class Record(models.Model):
title = models.CharField(max_length=50)
description = models.CharField(max_length=200)
execution = models.ForeignKey(ProgramExecution, on_delete=models.PROTECT,null=True)
timestamp = models.DateTimeField(auto_now_add=True)
creator = models.ForeignKey(User, on_delete=models.PROTECT)
record_type = models.CharField(max_length=50,default='template')
def __str__(self):
return self.title
class TemplateRecord(Record):
class Meta:
proxy = True
def create_report(self,creator,execution):
stages = self.stage_set.all();
self.record_type = 'record'
self.pk = None;
self.execution = execution
self.creator = creator
self.save();
for stage in stages :
samples = stage.sample_set.all()
stage.pk = None
stage.stage_type = 'record'
stage.record = self
stage.save();
for sample in samples :
tests = sample.testnum_set.all()
sample.sample_type = 'record'
sample.stage = stage
sample.sample_time = timezone.now()
sample.sampler = creator
for samplenum in range(sample.number_of_samples):
sample.pk = None
sample.save();
for test in tests :
test.pk = None
test.test_type = 'record'
test.sample = sample
test.tester = creator
test.save();
#-----------------------------------------------------------------------------------------------------------------------------
class Stage(models.Model):
record = models.ForeignKey(Record, on_delete=models.CASCADE)
title = models.CharField(max_length=50)
stage_type = models.CharField(max_length=50,default='template')
def __str__(self):
return self.title
#-----------------------------------------------------------------------------------------------------------------------------
class Sample(models.Model):
stage = models.ForeignKey(Stage, on_delete=models.CASCADE)
name = models.CharField(max_length=50)
sample_time = models.DateTimeField(default=timezone.now)
sample_location = models.CharField(max_length=50)
sampler = models.ForeignKey(User, on_delete=models.PROTECT)
sample_type = models.CharField(max_length=50,default='template')
number_of_samples = models.PositiveSmallIntegerField(null=True,default=1)
def __str__(self):
return self.name
#-----------------------------------------------------------------------------------------------------------------------------
class TestNum(models.Model):
sample = models.ForeignKey(Sample, on_delete=models.CASCADE)
name = models.CharField(max_length=50)
result = models.DecimalField(max_digits=15, decimal_places=5,null=True)
acceptance = models.CharField(max_length=50)
maximum_acceptance = models.DecimalField(max_digits=15, decimal_places=5)
minimum_acceptance = models.DecimalField(max_digits=15, decimal_places=5)
test_type = models.CharField(max_length=50,default='template')
tester = models.ForeignKey(User, on_delete=models.PROTECT)
def __str__(self):
return self.name
#-----------------------------------------------------------------------------------------------------------------------------
and my function is in view.py :
from django.shortcuts import render, get_object_or_404, redirect
from django.contrib import messages
from django.contrib.auth.models import User
from django.urls import reverse
from django.views.generic import ListView, DetailView, CreateView, UpdateView, DeleteView, TemplateView
from django.contrib.auth.mixins import LoginRequiredMixin, UserPassesTestMixin, PermissionRequiredMixin
from .models import Record, TemplateRecord, Stage, Sample, TestNum
import datetime
from django.utils import timezone
class CreateEmptyReport (PermissionView, UpdateView):
model = TemplateRecord
permission_required = 'ETRecord.add_record'
fields = ['execution']
def get_object(self):
template_list = TemplateRecord.objects.filter(record_type='template')
return super().get_object(queryset = template_list)
def form_valid(self,form):
self.object.create_report(creator=self.request.user,execution=form.instance.execution)
return super().form_valid(form);
def get_success_url(self):
return reverse('ETRecord:report_details',kwargs= {'pk': self.object.id})
在旧版本上,它应复制记录和所有相关阶段、样品和测试,但在更新后,它仅复制记录,没有相关阶段或样品
我尝试卸载并重新安装旧版本的verison它只在旧版本上工作,因此如何使其与新的3.2版本兼容?在复制记录之前,您正在创建queryset,这似乎很好
stages = self.stage_set.all();
但是。。。Django在访问此queryset之前不会解析它。较旧版本的Django可能只保留父元素的ID,因此在更改self
上的ID后,queryset不会更改,但较新版本的Django保留整个对象,并在数据库上实际执行queryset之前提取对象的ID
这会导致for循环在连接到新记录实例(您刚刚创建了它,所以它是一个空查询集)的阶段上迭代,而不是在旧的阶段上迭代
要解决该问题,可以提前强制执行queryset(例如,将其强制转换为列表),或者创建不使用self
对象,但显式使用旧对象ID的queryset,例如:
stages = Stage.objects.filter(record_id=self.id);
运行
py manage.py runserver
时会出现什么错误?没有错误。D:\code\ValMS>py manage.py runserver通过StatReloader执行系统检查监视文件更改。。。系统检查未发现任何问题(0静音)。2021年5月6日-14:37:53 Django版本3.2.2,使用设置“ValMS.settings”在启动开发服务器时使用CTRL-BREAK退出服务器。[06/May/2021 14:37:59]“GET/ValPlanner/program/9/details/HTTP/1.1”200 10678[06/May/2021 14:38:08]“POST/ETRecord/record/30/create_empty_report HTTP/1.1”3020[06/May/2021 14:38:08]“GET/ETRecord/report/36/details HTTP/1.1”200 7190