2016-12-16 94 views
0

我在Django很新,并试图实现Django import-export。我的三个相关模型是官员,事件和细节。官员和事件通过细节处于M2M关系中。除了导入详细信息外,我还获得了所有功能。当我尝试通过导入按钮进行导入时,我在导入的.xls或.csv文件中获得“NOT NULL约束失败:police_archive_details.incident_id”。django导入导出“NOT NULL约束失败”

这是我(目前)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) 

而这里的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) 
+0

您可能有一个名为police_archive_details的外键,但在您提供的代码中无处可查。有更多的代码(模型)?无论如何,显示的错误告诉你,现场police_archive_details(这可能是一个FK事件)没有事件:它是空的,但你不允许(详见事​​件,添加null = True) –

+0

我不知道我理解。警察档案是应用程序,细节是一个模型。我的代码正在工作。 –

回答

1

OK,我昨天花了一整天的调试,并得到了一切工作正常。这里是我的admin.py,models.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 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) 

另一个需要注意的是,您需要在电子表格中添加一个'id'列。我能够将我的空白留空,然后Django会生成一个用作主键的ID。

相关问题