首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >填充ManyToManyField

填充ManyToManyField
EN

Stack Overflow用户
提问于 2016-01-21 01:06:25
回答 2查看 2K关注 0票数 1

我的models.py

代码语言:javascript
复制
class Ingredient(models.Model):
    name = models.CharField(max_length=16, unique=True)
    price = models.SmallIntegerField()
    def __str__(self):
        return self.name

class Topping(models.Model):
    name = models.CharField(max_length=32)
    ingredient = models.ForeignKey(Ingredient, related_name='indole', 
        blank=True, null=True, default='base')
    def __str__(self):
        return self.nome

class Pizza(models.Model):
    nome = models.CharField(max_length=32, unique=True)
    toppings = models.ManyToManyField(Topping)
    def __str__(self):
        return self.nome

在行政管理中,它是有效的!我可以添加配料,比萨饼等,但我想使用脚本来填充。

我的script

代码语言:javascript
复制
import os
os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'recipt.settings')

import django
django.setup()

from core.models import *

def populate():
    cheap = add_ingredient('Cheap', 3)
    base = add_ingredient('Base', 5)
    good = add_ingredient('Good', 10)

    cheese = add_topping('Cheese', None)
    tomato = add_topping('Tomato', None)
    olive = add_topping('Olive', None)  

    simple = add_pizza('Simple', cheese) #just one toppings for now
    complex = add_pizza('Complex', tomato)

def add_ingredient(name, price):
    i = Ingredient.objects.get_or_create(name=name, price=price)[0]
    i.save()
    return i

def add_topping(name, ingredient):
    t = Topping.objects.get_or_create(name=name, ingredient=ingredient)[0]
    t.save()
    return t

def add_pizza(name, toppings):
    p = Pizza.objects.get_or_create(name=name, toppings=toppings)[0]
    p.save()
    return p

if __name__ == '__main__':
    print ("Starting Core population script...")
    populate()

这个剧本适用于配料和配料,但不适用于比萨。

我的error (很抱歉格式化):

开始核心人口剧本..。 回溯(最近一次调用): 文件"c:\Python34\Scripts\recipt\myvenv\lib\site-packages\django\db\mode ls\query.py",第465行,在get_or_create中 返回self.get(**查找),False 文件"c:\Python34\Scripts\recipt\myvenv\lib\site-packages\django\db\mode ls\query.py",第387行,在get中 self.model._meta.object_name core.models.DoesNotExist:比萨饼匹配查询不存在。 在处理上述异常的过程中,发生了另一个异常: 回溯(最近一次调用): 文件"populate_core.py",第437行,模块中 人口() 文件"populate_core.py",第63行,在填充 simple = add_pizza('Simple',奶酪) 文件"populate_core.py",第307行,add_pizza P= Pizza.objects.get_or_create(name=name,toppings=toppings) 文件"c:\Python34\Scripts\recipt\myvenv\lib\site-packages\django\db\mode ls\manager.py",第122行,在manager_method中 返回getattr(self.get_queryset(),name)(*args,**kwargs) 文件"c:\Python34\Scripts\recipt\myvenv\lib\site-packages\django\db\mode ls\query.py",第467行,在get_or_create中 返回self._create_object_from_params(查找,参数) 文件"c:\Python34\Scripts\recipt\myvenv\lib\site-packages\django\db\mode ls\query.py",第499行,在_create_object_from_params中 obj = self.create(**params) 文件"c:\Python34\Scripts\recipt\myvenv\lib\site-packages\django\db\mode ls\query.py",第399行,在create中 obj = self.model(**kwargs) 文件"c:\Python34\Scripts\recipt\myvenv\lib\site-packages\django\db\mode ls\base.py",第443行,在init中 引发TypeError(“‘’%s‘’是该函数的无效关键字参数”% li st(kwargs)) TypeError:'toppings‘是该函数的无效关键字参数

有什么帮助吗?我在某个地方读到,我应该把配料留为空白,然后再加,但是.

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2016-01-21 01:36:19

当您创建具有ManyToMany字段的数据库记录时,无法正常执行。您必须创建对象,然后向ManyToMany字段添加内容。就像这样。

代码语言:javascript
复制
class Author(models.Model):
    name = models.CharField(max_length=100)
class Article(models.Model):
    name = models.CharField(max_length=100)
    authors = models.ManyToManyField(Author)
zach = Author("Zach Braff")
zach.save()
# Say Zach writes an article...
# You can't do this because the authors field could have many things in it. 
a1 = Article(name="Scrubs remake coming?", authors=zach)

# Instead, you have to do this...
a1 = Article(name="Scrubs remake coming?")
a1.authors.add(zach)

a1.save()

您可能要做的是用它的等效值替换get_or_create(),如下所示。

代码语言:javascript
复制
p = Pizza.objects.filter(name=name, toppings=toppings)
# This is faster than `if p`
if p.exists():
   return p
else:
    p = Pizza.objects.create(name=name)
    p.toppings.add(toppings)
    p.save()
    return p

我认为那应该有效。

票数 3
EN

Stack Overflow用户

发布于 2016-01-21 11:22:12

很管用,谢谢。

这里是我在script中的新代码

代码语言:javascript
复制
simple = add_pizza('Simple', [cheese, tomato])
complex = add_pizza('Complex', [cheese, tomato, olive])

def add_pizza(name, toppings):
    p = Pizza.objects.filter(name=name)
    if p.exists():
        pass
    else:
    p = Pizza.objects.create(name=name)
    for t in toppings:
        p.toppings.add(t)
    p.save()
    return p
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/34913632

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档