【问题标题】:Calling Model.add() with a variable as parameter使用变量作为参数调用 Model.add()
【发布时间】:2016-05-01 21:18:46
【问题描述】:

我正在尝试使用 django ORM 导入一些数据。所以,我已经构建了一个脚本,它可能会从 Excel 表中填充。

然后,通过 python 控制台,我正在做:execfile('import.py')

我的 import.py 中会有类似的内容:

from catalog.models import (User, Product, Project)

PROJECT_FILLER_USER_ID = 1
PROJECT_TITLE = "Some Title"
PROJECT_DESCRIPTION = "Some description"
IS_PROJECT_ACTIVE = True

f = User.objects.get(id=PROJECT_FILLER_USER_ID)
p = Project.objects.create(filler=f, title=PROJECT_TITLE, description=PROJECT_DESCRIPTION, active=IS_PROJECT_ACTIVE)

PROJECT_PRODUCTS_LIST = "1, 2, 3, 8"

# Lists are filled with id with ',' as separator
p.products.add(PROJECT_PRODUCTS_LIST)

所以基本上,我希望它做一些事情,比如创建项目,然后从其他模型添加它的内容。

例如,在创建项目之后,应该会出现这样的情况:p.products.add(1, 2, 3, 8)。但是当我将 id 列表作为字符串传递时,Django 似乎不喜欢。

我该如何处理?

【问题讨论】:

    标签: python django django-models orm


    【解决方案1】:

    你需要先创建一个列表,"1, 2, 3 ,8" 是一个字符串不是一个列表,所以它远没有工作,你需要[1, 2, 3, 8]

    其次,对于 M2M 字段,当您有一个 id 列表时,您需要像这样调用 add

    project_list = [1, 2, 3, 8]
    p.prodeucts.add(*project_list)
    

    这里的星号是解压参数列表的python方式。一个* 将用于列表/元组参数,而** 将用于字典。查看PEP448 文档了解更多详情。

    【讨论】:

    • '*' 字符是有意的吗?如果是,为什么?
    • 好的,谢谢,另一个问题,我可以在create() 中使用字符串作为DateTimeField 吗?
    • 不,您需要先创建一个日期时间对象。使用 python datetime 模块创建日期时间:docs.python.org/2/library/datetime.html
    • hm 我设法用create(date="2016-01-15T17:18:44.258843Z", ...) 之类的东西做到了,看起来它没有问题
    • 啊,我的脑海里不知何故未能将您的6 digits 链接到microseconds。要知道日期时间,请执行以下操作:from django.utils import timezone 然后timezone.make_aware(your_datetime_obj, timezone.get_current_timezone())
    猜你喜欢
    • 2020-01-21
    • 1970-01-01
    • 1970-01-01
    • 2017-05-11
    • 2013-08-04
    • 1970-01-01
    • 2011-04-29
    • 2013-09-20
    • 2016-03-12
    相关资源
    最近更新 更多