【问题标题】:How to store Unique=True in database in django如何在 django 的数据库中存储 Unique=True
【发布时间】:2021-05-11 14:56:10
【问题描述】:

我的应用程序保存不同学校的书籍记录我有一个 Klass 模型,可以让每所学校都键入学校的课程。我还有一个用于批量导入书籍详细信息的进出口资源。但是我得到一个错误,因为已经有两所学校分别有表格 1 表格 2 和表格 3。它返回 MultipleObjectsReturned 错误

get() returned more than one Klass -- it returned 2!

我该如何解决我的情况???

class ImportStudentsResource(resources.ModelResource):
    school = fields.Field(attribute = 'school',column_name='school', widget=ForeignKeyWidget(School, 'name'))
    klass = fields.Field(attribute = 'klass',column_name='class', widget=ForeignKeyWidget(Klass, 'name'))
    stream = fields.Field(attribute = 'stream',column_name='stream', widget=ForeignKeyWidget(Stream, 'name'))
    class Meta:
        model = Student
        fields = ('school','student_id','name','year','klass','stream')
        import_id_fields = ('student_id',)
        import_order = ('school','student_id','name','year','klass','stream')

class uploadStudents(LoginRequiredMixin,View):
    context = {}
    def get(self,request):
        form = UploadStudentsForm()
        self.context['form'] = form
        return render(request,'libman/upload_student.html',self.context)

    def post(self, request):
        form = UploadStudentsForm(request.POST , request.FILES)
        data_set = Dataset()
        if form.is_valid():
            file = request.FILES['file']
            extension = file.name.split(".")[-1].lower()
            resource = ImportStudentsResource()
            if extension == 'csv':
                data = data_set.load(file.read().decode('utf-8'), format=extension)
            else:
                data = data_set.load(file.read(), format=extension)
            result = resource.import_data(data_set, dry_run=True, collect_failed_rows=True, raise_errors=True)
            if result.has_validation_errors() or result.has_errors():
                messages.success(request,f'Errors experienced during import.')
                print("error", result.invalid_rows)
                self.context['result'] = result
                return redirect('upload_students')                
            else:
                result = resource.import_data(data_set, dry_run=False, raise_errors=False)
                self.context['result'] = None
                messages.success(request,f'Students uploaded successfully.')                
        else:
            self.context['form'] = UploadStudentsForm()

        return render(request, 'libman/upload_student.html', self.context)

class Student(models.Model):
    school = models.ForeignKey(School, on_delete=models.CASCADE)
    name = models.CharField(max_length=200)
    now = datetime.datetime.now()
    YEAR = [(str(a), str(a)) for a in range(now.year-2, now.year+2)]
    year = models.CharField(max_length=4, choices = YEAR)
    student_id = models.CharField(max_length=20,unique=True)
klass = models.ForeignKey(Klass,on_delete=models.CASCADE)
    stream = models.ForeignKey(Stream,on_delete=models.CASCADE)

【问题讨论】:

  • 当我尝试为另一所学校创建相同的班级时,将 klass 字段设置为唯一也会引发错误...
  • 您需要为所有条目添加主键。
  • 我该怎么做??????
  • @kinshukdua Django 自动创建一个主键,如果没有明确告知 not 这样做

标签: python-3.x django django-views django-import-export


【解决方案1】:

您的标题和问题有点令人困惑,但我认为这很可能会发生,因为每当您导入数据时,逻辑都无法唯一识别“klass”的唯一实例。您正在使用与类的外键关系的“名称”属性。确保“名称”唯一标识一个 Klass 实例。

如果名称不是唯一的,那么您可以考虑使用唯一字段,例如 Klass 主键。如果这不可能,那么您将不得不想出某种方法来唯一标识要在 FK 关系中使用的 Klass,也许使用字段组合(学校 + 班级?)。您必须继承 ForeignKeyWidget 来处理这种情况。

ForeignKeyWidget docs

【讨论】:

  • 我正在为此苦苦挣扎。请举个例子来说明如何解决这个问题。
  • 首先查看导入文件中的“类”列,从 Klass 表中找到返回 > 1 结果的条目。 This 是错误的来源。
  • 我无法让它工作,请提供更详细的解释......
猜你喜欢
  • 2021-05-02
  • 2013-03-05
  • 2014-12-08
  • 1970-01-01
  • 1970-01-01
  • 2013-08-31
  • 2016-04-08
  • 1970-01-01
  • 2022-11-21
相关资源
最近更新 更多