2016-12-16 29 views
0

私はDjangoでかなり新しく、Django import-exportを実装しようとしています。私の3つの適切なモデルは、役員、事件、および詳細です。役員とインシデントは、詳細を通じたM2Mの関係にあります。私は詳細をインポートする以外に機能するすべての機能を手に入れました。インポートボタンを使用してインポートしようとすると、インポートする.xlsファイルまたは.csvファイルの各行に対して「NOT NULL制約が失敗しました:police_archive_details.incident_id」が表示されます。ここでdjango import-export "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インシデントである可能性があります)に事件がないことを示しています:ヌルですが、許可していません(詳細はインシデント参照、ヌル= 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を生成します。

関連する問題