Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/django/23.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 为什么在django 3.1.10上创建的模型函数不';你不能在3.2上工作吗?_Python_Django - Fatal编程技术网

Python 为什么在django 3.1.10上创建的模型函数不';你不能在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

我在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 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