Найти - Пользователи
Полная версия: Import csv
Начало » Django » Import csv
1 2
serrrgggeee
Здравствуйте мне нужно сделать импорт csv со связями FK. Но я то получаю нужное поле пустым либо такую ошибку
Line number: 1 - Column ‘city’: invalid literal for int() with base 10: ‘Moskow’. вот мой код
from __future__ import unicode_literals
from django.db import models
class Location(models.Model):
    name = models.CharField('name', max_length=100)
    iata = models.CharField('iata', max_length=100)
    oon = models.CharField('oon', max_length=100)
    typelocation = models.CharField('typelocation', max_length=100)
    ngrad = models.IntegerField(blank=True, null=True)
    nmin = models.IntegerField(blank=True, null=True)
    wgrad = models.IntegerField(blank=True, null=True)
    wmin = models.IntegerField(blank=True, null=True)
    typetime = models.CharField('typetime', max_length=100)
   
    class Meta:
        abstract = True
class City(models.Model):
	name = models.CharField('name', max_length=100)
	def __unicode__(self):
		return self.name
class Contry(models.Model):
	name = models.CharField('name', max_length=100)
	def __unicode__(self):
		return self.name
class Airport(Location):
    city = models.ForeignKey(City, related_name='city',  blank=True, null=True)
    contry = models.ForeignKey(Contry, related_name='contry', blank=True, null=True)
    def __unicode__(self):
        return self.name

from django.contrib import admin
from import_export import fields,widgets
from import_export.widgets import ForeignKeyWidget
from import_export.admin import ImportExportModelAdmin
from import_export.admin import ImportExportActionModelAdmin
from import_export.admin import ImportMixin, ExportMixin
from django.contrib.admin import DateFieldListFilter
from import_export import resources, fields
from import_export import resources
from .models import City, Airport, Contry
class StoreWidget(widgets.ForeignKeyWidget):
	def clean(self, value):
		return self.model.objects.get_or_create(city = value)[0]
    
class Cityresources(resources.ModelResource):
	city = fields.Field(column_name='city', attribute='City', widget=StoreWidget(City, 'city'))
	class Meta:
		model = Airport
		fields = ('city','name')
	def get_instance(self, instance_loader, row):
		# Returning False prevents us from looking in the
		# database for rows that already exist
		return False
class AirportAdmin(ImportMixin,admin.ModelAdmin):
    resource_class = Cityresources
    fieldsets = [
        ('name', {'fields':['name']}),
        ('city', {'fields':['city']}),
        ('contry', {'fields':['contry']}),
        ('iata', {'fields':['iata']}),
        ('oon', {'fields':['oon']}),
        ('ngrad', {'fields':['ngrad']}),
        ('nmin', {'fields':['nmin']}),
        ('wgrad', {'fields':['wgrad']}),
        ('wmin', {'fields':['wmin']}),
        ('typetime', {'fields':['typetime']}),
    ]
admin.site.register(Airport, AirportAdmin)
admin.site.register(Contry)
admin.site.register(City)
импорт без связей не вызывает затруднения или если есть нужная запись в поле FK, но новую создать не могу, в чем тут ошибка?
FishHook
serrrgggeee
Здравствуйте мне нужно сделать импорт csv со связями FK
не могу увидеть, где в вашем коде csv
serrrgggeee
ну вообще данные передаются с админки, вот все происходит в этом классе Cityresources
FishHook
serrrgggeee
Я правда не понимаю. Вы пишите
Здравствуйте мне нужно сделать импорт csv со связями FK.
Вы можете показать, в каком месте у вас происходит импорт в csv?
serrrgggeee
class Cityresources(resources.ModelResource):
	city = fields.Field(column_name='city', attribute='City', widget=StoreWidget(City, 'city'))
	class Meta:
		model = Airport
		fields = ('city','name')
	def get_instance(self, instance_loader, row):
		# Returning False prevents us from looking in the
		# database for rows that already exist
		return False

В классе Meta model= Airport, это таблица куда будут сохраняться данные пришедшие с файла csv, что бы появилась кнопка в панеле администратора нужно проипсать
class AirportAdmin(ImportMixin,admin.ModelAdmin):
resource_class = Cityresources # используемые класс при импорте

вот как то так) не получается импортировать только связаные даные, тоесть если имя свзи не существует, если оно там есть топроблем нет в таблицу Airport прописывается в нужно поле id и все в порядке, а нужно что бы еще была возможность создавать запись в таблице City
FishHook
serrrgggeee
нужно проипсать
class AirportAdmin(ImportMixin,admin.ModelAdmin):
Дайте ссылку на документацию Джанго, описывающую этот миксин.
serrrgggeee
Your text to link here…
serrrgggeee
Я понял что тут ответа я не дождусь, я почти получил то что мне нужно, только вот в модели FK есть два поля, если я делаю инсерт в одно поле то проблем нет, а если в два то етсь, не получается сделать вставку одновременно, а только в одной строке одно поле, а в другой другое, вот мой код
class PlaceWidget(widgets.ForeignKeyWidget):
	def clean(self, value):
		return self.model.objects.get_or_create(name = value)[0]
	def after_import(dataset, result, dry_run, **kwargs):
		return self.model.objects.get_or_create(continent = value)[0]
	
class Placeresources(resources.ModelResource):
	#city = fields.Field(column_name='city', attribute='city', widget=PlaceWidget(City, 'name'))
	country = fields.Field(column_name='country', attribute='country', widget=PlaceWidget(Country, 'name'))
	continent = fields.Field(column_name='continent', attribute='continent', widget=PlaceWidget(Country, 'continent'))
	#name = fields.Field(attribute='name',column_name='name')
	class Meta:		
		model = Airport
		fields = ('name','country','oon','iata','ngrad', 'nmin', 'wgrad', 'wmin', 'typetime')
		export_order = fields
		skip_unchanged = True
        report_skipped = False
	def get_instance(self, instance_loader, row):
		# Returning False prevents us from looking in the
		# database for rows that already exist
		return False
class AirportAdmin(ImportExportActionModelAdmin,admin.ModelAdmin):
    resource_class = Placeresources
    fieldsets = [
        ('name', {'fields':['name']}),
        ('city', {'fields':['city']}),
        ('country', {'fields':['country']}),
        ('iata', {'fields':['iata']}),
        ('oon', {'fields':['oon']}),
        ('ngrad', {'fields':['ngrad']}),
        ('nmin', {'fields':['nmin']}),
        ('wgrad', {'fields':['wgrad']}),
        ('wmin', {'fields':['wmin']}),
        ('typetime', {'fields':['typetime']}),
    ]
admin.site.register(Airport, AirportAdmin)
FishHook
serrrgggeee
Я понял что тут ответа я не дождусь,
Вам понадобились сутки, чтобы наконец-то после многочисленных просьб и уговоров посвятить сообщество в тайны своего кода и сообщить, какую-же стороннюю батарейку вы к нему прикрутили. Как задаете вопрос, такую реакцию и получаете.
serrrgggeee
сейчас решают такую задачу , вот здесь
country = fields.Field(column_name='country', attribute='country', widget=PlaceWidget(Country, 'name'))
мне нужно передать еще один аргумент, если функция на то предназначена, этим аргументом будет значение поля, значит мне нужно вытащить значение поля, если это осуществимо то тогда здесь
def clean(self, value):
		return self.model.objects.get_or_create(name = value)[0]
нужно будет записать переданный аргумент таким образом
def clean(self, value):
		return self.model.objects.get_or_create(name = value, continent=continent)[0]
имеется ввиду что континент это переданный аргумент и будет он записываться в поле continent. Так что осталось понять как передать этот аргумент сюда.
This is a "lo-fi" version of our main content. To view the full version with more information, formatting and images, please click here.
Powered by DjangoBB