【发布时间】:2021-08-19 05:04:20
【问题描述】:
我有 2 个模型——AssetType 和 Asset(都有 ID,Asset 有一个指向 AssetType 的外键)
我想使用资产类型名称而不是 ID 在资产表中批量插入行。
我尝试执行 df.to_sql() 但它无法工作,因为我的 df 包含“资产类型名称”而不是资产类型 ID。有没有办法轻松转换?
预期输出
资产类型表如下所示:
id | name | description
1 | at1 | desc1
资产表应如下所示
asset_name | display_name | asset_type_id
n1 | d1 | 1
我想在 Asset 表中插入的数据框如下所示(输入): -- 注意我正在插入asset_type_name,它应该被转换为asset_type_id
asset_name | display_name | asset_type_name
n1 | d1 | at1
所以,我在我的数据框中传入了at1,但想将其作为资产类型的“id=1”插入。这在 django 中可行吗?
我的模型是:
class AssetType(models.Model):
id = models.AutoField(primary_key=True)
name = models.CharField(max_length=80, unique=True)
description = models.CharField(max_length=80)
class Asset(models.Model):
asset_type = models.ForeignKey(AssetType, on_delete=models.CASCADE)
asset_name = models.CharField(max_length=80)
display_name = models.CharField(max_length=80)
我的序列化器如下所示:
class AssetTypeSerializer(serializers.ModelSerializer):
class Meta:
model = AssetType
fields = "__all__"
class AssetSerializer(serializers.ModelSerializer):
asset_type_name = serializers.CharField(source='asset_type.name')
class Meta:
model = Asset
fields = ("id", "asset_type_name", "asset_name", "display_name")
我的视图看起来像这样:
class AssetViewSet(mixins.ListModelMixin, viewsets.GenericViewSet):
"""
A simple ViewSet for viewing and editing accounts.
"""
queryset = Asset.objects.select_related()
serializer_class = AssetSerializer
@action(methods=['POST'], detail=False)
def bulk_create(self, request):
df = pd.DataFrame.from_dict(dict(request.data['data']))
df.to_sql(Asset._meta.db_table, con=engine, if_exists='append', index=False, chunksize=500)
Django 版本 - 3.2 数据库 - SQL 服务器
【问题讨论】:
-
Asset_type_name 是唯一的。在我的 AssetType 模型中,它显示
unique=True
标签: python sql-server django django-models