【问题标题】:How can i import export with foreign key relationship如何使用外键关系导入导出
【发布时间】:2022-01-20 09:36:05
【问题描述】:

我有包含用户地址和他的电话号码的 csv 文件,我如何将其导入我的地址表中。因为我不知道每个用户的用户 ID。

xlsx 中的 CSV 文件: csv 格式:

user_id__phone,address1,address2,state,country,pincode

99999999,"addrss","addres2",somestate,Country,11111

我收到以下错误

Line number: 1 - null value in column "user_id_id" of relation "proj_auth_useraddress" violates not-null constraint DETAIL: Failing row contains (432, null, null, someaddress, , , null).

但我知道用户和地址的关系是通过他的电话号码。 user_id__phone

# Models.py
class AppUser(AbstractUser):
    phone = models.CharField(max_length=15, unique=True, null=True)
    ...
class UserAddress(models.Model):
    address_id = models.AutoField(primary_key=True)
    user_id = models.ForeignKey(AppUser, on_delete=models.CASCADE)
    lat = models.FloatField(null=True, blank=True)
    lng = models.FloatField(null=True, blank=True)
    address1 = models.CharField(max_length=100)
    address2 = models.CharField(max_length=100, null=True, blank=True)
    city = models.CharField(max_length=50)
    pincode = models.IntegerField()

# Admin.py
@admin.register(UserAddress)
class AddressAdmin(ImportExportModelAdmin):
    resource_class = AddressAdminResource

# Resource.py
class AddressAdminResource(resources.ModelResource):
    class Meta:
        model = UserAddress
        import_id_fields = ('address_id',)

【问题讨论】:

  • 分享csv文件结构,方便我们更好的帮助
  • @Polymath 完成。
  • 导入数据的代码在哪里(查看)
  • @PavanKumarTS 它在 # Admin.py 和 # Resource.py 我使用 ImportExportModelAdmin 为它

标签: django django-models django-rest-framework


【解决方案1】:

如果 AppUser 中的 phone 对于每个用户都是唯一的,那么您可以使用 pandas 将记录从 csv 迁移到数据库

您可以尝试以下解决方案:

import pandas as pd

csv_file = pd.read_csv(<yourcsvfile>.csv)

for index, rows in csv_file.iterrows():
    user_id__phone = rows["user_id__phone"]
    address1 = rows["address1"]
    address2 = rows["address2"]
    country = rows["country"]
    pincode = rows["pincode"]
    
    appuser_instance = AppUser.objects.get(phone=user_id__phone)
    
    # get_or_create is used to eliminate forming or any duplicate record 
    usershipping, created = UserAddress.objects.get_or_create(
        user_id=appuser_instance,
        address1=address1,
        address2=address2,
        city=city,
        pincode=pincode
        )
    
    # created defines whether new record was created or was edited on existing record
    # created = True (new record created)
    # craeted = False (edited on existing record)
    
    if created:
        usershipping.save()

【讨论】:

  • 这个解决方案在我的许多项目中帮助了我,因为它涉及将数据从 csv 迁移到 Django 数据库
  • 谢谢伙计。我知道它有效,但我想通过查询用户 ID
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2010-09-26
  • 1970-01-01
  • 2021-01-01
  • 1970-01-01
  • 2021-07-21
  • 2014-10-21
  • 2015-03-21
相关资源
最近更新 更多