2016-12-16 33 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。

相關問題