2016-12-16 7 views
0

Я довольно новичок в Django и застреваю, пытаясь реализовать Django import-export. Мои три подходящие модели - офицер, инцидент и детали. Сотрудник и Инцидент находятся в отношениях M2M через Детали. Я получил всю функциональность для работы, кроме импорта деталей. Когда я пытаюсь импортировать через кнопку импорта, я получаю «NOT NULL constraint failed: polic_archive_details.incident_id» для каждой строки в файле .xls или .csv, который я импортирую.django import-export "NOT NULL constraint failed"

Вот мой (ток) 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

у вас может быть внешний ключ где-то с именем polic_archive_details, но в коде, который вы указали, его нигде не найти. Есть ли еще код (модели)? Во всяком случае, показанная ошибка говорит вам, что поле polic_archive_details (которое может быть инцидентом FK) не имеет инцидента: оно пустое, но вы этого не допустили (см. Инцидент в деталях, добавьте null = True) –

+0

Я не уверен, что я Понимаю. Полицейский архив - это приложение, а детали - это модель. Мой код ниже работает. –

ответ

1

ОК, вчера я провел весь день отладки и получил все работает правильно. Теперь вот мой 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 будет генерировать идентификатор для использования в качестве первичного ключа.

 Смежные вопросы

  • Нет связанных вопросов^_^