Python 从另一个模型创建模型的多个实例?
如何从与外键相关的另一个模型创建模型的多个实例?示例代码如下:Python 从另一个模型创建模型的多个实例?,python,django,django-models,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 = C
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完成?create\u chairs()
是一种方法,而不是属性。您可以通过以下方式创建桌子和椅子:
t1 = Table(color="blue")
t1.create_chairs(4, 'natural')
是的,这种关系逻辑属于模型。顺便说一下,for语句的可以替换为:
for _ in range(num):
现在存储所有这些家具是另一个步骤。创建每个实体后,您需要put()
它们,以便它们在程序结束后存在 当前方法的一个问题是,您正在创建椅子,但没有将它们分配给任何对象,因此有些椅子没有桌子
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)
正如他们所说。创建椅子是一种方法
,而不是模型属性
,那么您必须创建表
模型的实例/对象
,然后添加新的椅子
t1 = Table.objects.create(color="blue")
t1.create_chairs(style='natural', num=4)
您必须更改方法,通过create()
方法使save()
生效
def create_chairs(self, num, style):
for _ in itertools.repeat(None, num):
Chair.objects.create(style=style, table=self)
什么是create_chairs={“style”:“natural”,“num”:4}
?它是如何工作的?它应该是Table类的方法,所以我可以从我的Table对象调用它。我想用一个单独的方法来做,但为什么不能在我的Table类中呢?如果我加上它,它将如何被称为t1。音乐椅子(4)?我以前从未见过[style]*num_chairs]
中s的语法[Chair(style=s)
,可以在文档中的某个地方链接它,这样我就可以了解它了?这是一个列表理解,也是编写Python时要掌握的核心内容。谷歌的帮助有很多来源。此外,您可以将其放在Table类中。不过,请确保将表格
切换为self
。如果将其放入表格类中,则会重新创建作为django一部分已经可用的功能。这是个坏主意,不要这样做。事实上,无论如何,你不应该把它作为一个单独的方法——它只是一个语法糖,而不是一个已经提供的方法,而且非常简洁。@Burnhan&limelights谢谢你的糖,我不太理解代码,但我将在这之后开始阅读列表理解。真的不知道该给谁颁奖?对于,Luan的很容易理解,但我从你那里学到了一些新的东西。这让我更进一步,但在调试器中,我得到了完整性错误:myapp\u chair.table\u id可能不是null
。传入“self”引用是否有问题?解决了完整性错误,忘记在我的创建_的调用中指定num参数。我喜欢你简单的回答,因为它很容易理解。谢谢,太好了!我很高兴帮助你D