如何从外键相关的另一个模型创建模型的多个实例?示例代码如下:
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?
答案 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()
它们,以便它们在程序结束后存在。