0

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

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})which 将创建一个具有 4 把椅子的 Table 对象。models.py 是否应该包含这样的逻辑,还是应该全部从 views.py 中完成?

4

3 回答 3

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)
于 2013-06-11T04:28:44.780 回答
1

正如他们所说。create_chair 是 a method,而不是 a ,那么您model attribute必须创建模型的 a 并添加新的。instance/objectTablechairs

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)
于 2013-06-11T04:30:28.360 回答
0

create_chairs()是一个方法,而不是一个属性。您可以通过以下方式创建桌子和椅子:

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

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

for _ in range(num):

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

于 2013-06-11T04:20:45.757 回答