简体   繁体   English

django import-export“ NOT NULL约束失败”

[英]django import-export “NOT NULL constraint failed”

I'm pretty new at Django and am stuck trying to implement Django import-export . 我在Django上还很新,并且一直在尝试实现Django import-export My three pertinent model are Officer, Incident, and Details. 我的三个相关模型是“官员”,“事件”和“详细信息”。 Officer and Incident are in a M2M relationship through Details. 官员和事件通过“详细信息”处于M2M关系中。 I have gotten all of the functionality to work besides importing details. 除了导入细节,我已经获得了所有功能。 When I try to import via the import button, I get "NOT NULL constraint failed: police_archive_details.incident_id" for each row in the .xls or .csv file I'm importing. 当我尝试通过导入按钮导入时,对于要导入的.xls或.csv文件中的每一行,我都收到“ NOT NULL约束失败:Police_archive_details.incident_id”。

Here's my (current) admin.py 这是我(当前)的admin.py

from django.contrib import admin
from import_export import resources, widgets, fields
from import_export.admin import ImportExportModelAdmin, ImportExportActionModelAdmin
from forms import AdminTextForm, OfficerTextForm

from .models import Officer, Incident, Details, SiteText

class FullNameForeignKeyWidget(widgets.ForeignKeyWidget):
    def get_queryset(self, value, row):
        return self.model.objects.filter(
            first_name__iexact=row["first_name"],
            last_name__iexact=row["last_name"]
        )

class DetailsInlineAdmin (admin.TabularInline):
    model = Details
    extra = 5




class OfficerResource(resources.ModelResource):

    class Meta:
        model = Officer

class OfficerAdmin(ImportExportModelAdmin):
    list_display = ('first_name', 'last_name', 'badge', 'department')
    search_fields = ['first_name', 'last_name']
    inlines = [DetailsInlineAdmin]
    resource_class = OfficerResource

    form=OfficerTextForm

    class Media:
        js = ('//ajax.googleapis.com/ajax/libs/jquery/1.9.1/jquery.min.js','/static/admin/js/admin/popup.js')



class IncidentResource(resources.ModelResource):

    officer = fields.Field(
        column_name='officer',
        attribute='officer',
        widget=widgets.ForeignKeyWidget(Officer, 'badge'))

    class Meta:
        fields = ('officer',)
        model = Incident   

class IncidentAdmin(ImportExportModelAdmin):
    list_display = ('office','case_number')
    search_fields = ['case_number']
    inlines = [DetailsInlineAdmin]
    resource_class = IncidentResource




class DetailsResource(resources.ModelResource):

    officer = fields.Field(
        column_name='officer',
        attribute='officer',
        widget=FullNameForeignKeyWidget(Officer))

    incident = fields.Field(
        column_name='incident',
        attribute='incident',
        widget=widgets.ForeignKeyWidget(Incident, 'case_number'))

    class Meta:
        fields = ('id','incident','officer__last_name','officer__first_name','allegation', 'finding', 'action')
        model = Details


class DetailsAdmin(ImportExportModelAdmin):
    list_display=('incident','officer', 'allegation', 'finding', 'action')
    search_fields = ['officer__last_name', 'incident__case_number']
    resource_class = DetailsResource

class SiteTextAdmin(admin.ModelAdmin):
    form=AdminTextForm





admin.site.register(Officer, OfficerAdmin)
admin.site.register(Incident, IncidentAdmin)
admin.site.register(Details, DetailsAdmin)
admin.site.register(SiteText, SiteTextAdmin)

And here's models.py 这是models.py

from __future__ import unicode_literals

from django.db import models
from tinymce import models as tinymce_models

class Officer(models.Model):
    first_name = models.CharField(max_length=80, blank=True, null=True)
    last_name = models.CharField(max_length=80, blank=True, null=True)
    badge = models.IntegerField(blank=True, null=True)
    department = models.CharField(max_length=50, blank=True, null=True)
    model_pic = models.ImageField(upload_to = "police_archive/officer_photos", default= 'noimage', blank=True, null=True)
    description = tinymce_models.HTMLField(blank=True, null=True)

    def __str__(self):
        return self.last_name + ', ' + self.first_name

    class Meta():
        ordering = ['last_name']    





class Incident(models.Model):
    officer = models.ManyToManyField(Officer, through='Details')
    case_number = models.CharField(max_length=50, blank=True)

    OFFICE_CHOICES = (
    ('CRA', 'Civilian Review Authority'),
    ('IA', 'Internal Affairs'),
    ('OPCR', 'Office of Police Conduct Review'),
    )
    office = models.CharField(max_length=10,
    choices=OFFICE_CHOICES,
    )

    def __str__(self):
        return self.case_number

    class Meta():
        ordering = ['-case_number']

class Details(models.Model):
    officer = models.ForeignKey(Officer, on_delete=models.CASCADE, blank=True)
    incident = models.ForeignKey(Incident, on_delete=models.CASCADE, blank=True)
    allegation = models.CharField(max_length=50, blank=True)
    finding = models.CharField(max_length=50, blank=True)
    action = models.CharField(max_length=50, blank=True)


    def __str__(self):
            return self.officer.first_name + ' '+ self.officer.last_name+ ', ' + self.incident.case_number

    class Meta():
        verbose_name_plural = "details"
        ordering = ['incident__case_number']


class SiteText(models.Model):
    content1 = tinymce_models.HTMLField()
    content2 = models.TextField(max_length=500, blank=True)

OK, I spent all day debugging yesterday and got everything working properly. 好的,我昨天花了一整天的调试时间,一切正常。 Here's my admin.py now, models.py is unchanged. 现在是我的admin.py,models.py保持不变。 I forget exactly which change solved the original error I posted about. 我完全忘记了哪个更改解决了我发布的原始错误。

from django.contrib import admin
from import_export import resources, widgets, fields
from import_export.admin import ImportExportModelAdmin, ImportExportActionModelAdmin
from forms import AdminTextForm, OfficerTextForm

from .models import Officer, Incident, Details, SiteText

class DetailsInlineAdmin (admin.TabularInline):
    model = Details
    extra = 5




class OfficerResource(resources.ModelResource):

    class Meta:
        model = Officer

class OfficerAdmin(ImportExportModelAdmin):
    list_display = ('first_name', 'last_name', 'badge', 'department')
    search_fields = ['first_name', 'last_name']
    inlines = [DetailsInlineAdmin]
    resource_class = OfficerResource

    form=OfficerTextForm

    class Media:
        js = ('//ajax.googleapis.com/ajax/libs/jquery/1.9.1/jquery.min.js','/static/admin/js/admin/popup.js')



class IncidentResource(resources.ModelResource):


    class Meta:
        fields = ('officer','case_number', 'office')
        model = Incident
        import_id_fields = ['case_number']

class IncidentAdmin(ImportExportModelAdmin):
    list_display = ('office','case_number')
    search_fields = ['case_number']
    inlines = [DetailsInlineAdmin]
    resource_class = IncidentResource




class DetailsResource(resources.ModelResource):

    class BadgeForeignKeyWidget(widgets.ForeignKeyWidget):
        def get_queryset(self, value, row):
            return self.model.objects.filter(
                badge__iexact=row["badge"]
            )

    officer = fields.Field(
        column_name='officer',
        attribute='officer',
        widget=BadgeForeignKeyWidget(Officer, 'last_name'))

    incident = fields.Field(
        column_name='incident',
        attribute='incident',
        widget=widgets.ForeignKeyWidget(Incident, 'case_number'))

    class Meta:
        fields = ('id','officer','incident', 'allegation', 'finding', 'action')
        model = Details


class DetailsAdmin(ImportExportModelAdmin):
    list_display=('incident','officer', 'allegation', 'finding', 'action')
    search_fields = ['officer__last_name', 'incident__case_number']
    resource_class = DetailsResource

class SiteTextAdmin(admin.ModelAdmin):
    form=AdminTextForm





admin.site.register(Officer, OfficerAdmin)
admin.site.register(Incident, IncidentAdmin)
admin.site.register(Details, DetailsAdmin)
admin.site.register(SiteText, SiteTextAdmin)

Another note is that you need to put an 'id' column in your spreadsheet. 另一个要注意的是,您需要在电子表格中放置一个“ id”列。 I was able to leave mine blank and then Django would generate an id to use as a primary key. 我能够将其留空,然后Django将生成一个ID用作主键。

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM