Уведомления

Группа в Telegram: @pythonsu

#1 Март 30, 2016 11:56:01

serrrgggeee
Зарегистрирован: 2014-03-31
Сообщения: 71
Репутация: +  0  -
Профиль   Отправить e-mail  

Import csv

Здравствуйте мне нужно сделать импорт 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, но новую создать не могу, в чем тут ошибка?

Офлайн

#2 Март 30, 2016 12:57:21

FishHook
От:
Зарегистрирован: 2011-01-08
Сообщения: 8312
Репутация: +  568  -
Профиль   Отправить e-mail  

Import csv

serrrgggeee
Здравствуйте мне нужно сделать импорт csv со связями FK
не могу увидеть, где в вашем коде csv



Офлайн

#3 Март 30, 2016 12:59:22

serrrgggeee
Зарегистрирован: 2014-03-31
Сообщения: 71
Репутация: +  0  -
Профиль   Отправить e-mail  

Import csv

ну вообще данные передаются с админки, вот все происходит в этом классе Cityresources

Офлайн

#4 Март 30, 2016 13:08:16

FishHook
От:
Зарегистрирован: 2011-01-08
Сообщения: 8312
Репутация: +  568  -
Профиль   Отправить e-mail  

Import csv

serrrgggeee
Я правда не понимаю. Вы пишите

Здравствуйте мне нужно сделать импорт csv со связями FK.
Вы можете показать, в каком месте у вас происходит импорт в csv?



Офлайн

#5 Март 30, 2016 13:21:29

serrrgggeee
Зарегистрирован: 2014-03-31
Сообщения: 71
Репутация: +  0  -
Профиль   Отправить e-mail  

Import csv

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

Офлайн

#6 Март 30, 2016 15:35:47

FishHook
От:
Зарегистрирован: 2011-01-08
Сообщения: 8312
Репутация: +  568  -
Профиль   Отправить e-mail  

Import csv

serrrgggeee
нужно проипсать
class AirportAdmin(ImportMixin,admin.ModelAdmin):
Дайте ссылку на документацию Джанго, описывающую этот миксин.



Офлайн

#7 Март 31, 2016 16:00:09

serrrgggeee
Зарегистрирован: 2014-03-31
Сообщения: 71
Репутация: +  0  -
Профиль   Отправить e-mail  

Офлайн

#8 Апрель 1, 2016 10:23:57

serrrgggeee
Зарегистрирован: 2014-03-31
Сообщения: 71
Репутация: +  0  -
Профиль   Отправить e-mail  

Import csv

Я понял что тут ответа я не дождусь, я почти получил то что мне нужно, только вот в модели 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)

Офлайн

#9 Апрель 1, 2016 10:41:14

FishHook
От:
Зарегистрирован: 2011-01-08
Сообщения: 8312
Репутация: +  568  -
Профиль   Отправить e-mail  

Import csv

serrrgggeee
Я понял что тут ответа я не дождусь,
Вам понадобились сутки, чтобы наконец-то после многочисленных просьб и уговоров посвятить сообщество в тайны своего кода и сообщить, какую-же стороннюю батарейку вы к нему прикрутили. Как задаете вопрос, такую реакцию и получаете.



Офлайн

#10 Апрель 1, 2016 11:37:33

serrrgggeee
Зарегистрирован: 2014-03-31
Сообщения: 71
Репутация: +  0  -
Профиль   Отправить e-mail  

Import csv

сейчас решают такую задачу , вот здесь

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. Так что осталось понять как передать этот аргумент сюда.

Офлайн

Board footer

Модераторировать

Powered by DjangoBB

Lo-Fi Version