从另一个模型创建模型的多个实例?

时间:2013-06-11 03:43:50

标签: python django django-models

如何从外键相关的另一个模型创建模型的多个实例?示例代码如下:

import itertools

class Table(models.Model):
    color = models.CharField(max_length=100, blank=True, default='')

    def create_chairs(self, num, style):
        for _ in itertools.repeat(None,num):
            c = Chair(style=style, table=self)


class Chair(models.Model):
    style = models.CharField(max_length=100, blank=True, default='')
    table = models.ForeignKey('Table')

尝试使用t1 = Table(color="blue", create_chairs={"style": 'natural', "num": 4})创建一个包含4把椅子的Table对象。 models.py甚至应该包含这样的逻辑,还是应该从views.py?

完成

3 个答案:

答案 0 :(得分:1)

您当前的方法存在的一个问题是您正在创建椅子,但没有将它们分配给任何东西,所以有没有桌子的椅子。

Django提供内置功能来处理这个问题,所以你不需要特定的方法:

t1 = Table(color='Blue')

chairs = [Chair(style=y) for y in ['Natural']*4]
for chair in chairs:
    t1.chair_set.add(chair)

如果您想在单独的方法中执行此操作,可以将其添加到任何类的models.py外部,最后:

def musical_chairs(table, num_chairs=4, style='Normal'):
    chairs = [Chair(style=s) for s in [style]*num_chairs]
    for chair in chairs:
        table.chair_set.add(chair)

答案 1 :(得分:1)

正如他们所说。 create_chair是method,而不是model attribute,那么您必须创建instance/object模型的Table,然后添加新的chairs

t1 = Table.objects.create(color="blue")
t1.create_chairs(style='natural', num=4)

您必须更改方法,才能通过save()方法create()

def create_chairs(self, num, style):
    for _ in itertools.repeat(None, num):
        Chair.objects.create(style=style, table=self)

答案 2 :(得分:0)

create_chairs()是一种方法,而不是属性。您可以这样创建桌椅:

t1 = Table(color="blue")
t1.create_chairs(4, 'natural')

是的,这个关系逻辑属于模型。顺便说一句,for语句可以替换为:

for _ in range(num):

现在存放所有这些家具是另一个步骤。创建每个实体后,您需要put()它们,以便它们在程序结束后存在。