【问题标题】:Problem populating Django many to many relationship with list用列表填充 Django 多对多关系的问题
【发布时间】:2020-07-15 18:53:10
【问题描述】:

我正在尝试使用来自外部 CSV 文件的数据填充我的 Django SQL 数据库,但是当我运行填充文件时,父 ManyToManyField 模型(电影)不会采用我从子(演员)提供的查询对象模型,因为(我认为)它是一个列表。是否可以使用 get_or_create 调用将列表解析为模型?如果没有,我该如何解决这个问题?

我的 models.py 文件如下所示:

class Actor(models.Model):
    actor_id = models.CharField(max_length=20, unique=True)
    name = models.CharField(max_length=40)

class Film(models.Model):
    film_id = models.CharField(max_length=20, unique=True)
    title = models.CharField(max_length=60)
    actors = models.ManyToManyField(Actor)

我的 populate.py 文件如下所示:

import pandas   
df = read_csv('csv_file.csv')

def populate_film():
    for index, row in in df.iterrows():
        film_csv_id = str(row['IMDb ID'])
        film_name = str(row['Film'])
        list_of_actors = row['Actors']

    #The CSV actors column returns a the list of actor_ids which I query against the Actor model
    #I then put these queries into a list for the get_or_create step

    actor_query_list = []
    for actor_csv_id in list_of_actors:
        actor_query = Actor.objects.get(actor_id = actor_csv_id)
        actor_query_list.append(actor_query.id)

    film = Film.objects.get_or_create(film_id = film_csv_id, title = film_name, actors = actor_query_list)

我收到的错误信息是:

Field 'id' expected a number but got [xxxx, xxxx].

谢谢!

【问题讨论】:

  • 我的第一直觉是错误发生在这段代码的末尾,因为get_or_create() 不返回 Film 对象,它返回一个 2 元组,错误来自于尝试以后再用。

标签: python sql django pandas csv


【解决方案1】:

如果你想使用你的字段作为 ID 而不是默认的 id 字段,你应该像这样将 'primary_key' 属性设置为 True:

actor_id = models.CharField(max_length=20, primary_key=True)

这可能会解决您的问题

【讨论】:

  • 所以我添加了这一步并运行了触发回溯的程序:禁止直接分配到多对多集合的前端。改用actors.set()。所以我在没有分配演员的情况下运行了 populate_film(),模型被演员模型中的演员的每个实例填充
猜你喜欢
  • 1970-01-01
  • 2023-01-08
  • 2015-07-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-10-20
  • 2019-09-14
  • 1970-01-01
相关资源
最近更新 更多