Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/django/19.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Django关系经理';s.create()用法?_Django_Orm_Django Models_Django Orm - Fatal编程技术网

Django关系经理';s.create()用法?

Django关系经理';s.create()用法?,django,orm,django-models,django-orm,Django,Orm,Django Models,Django Orm,我有两个模型:Play和playampactor,定义(部分)为: 我的一段代码中有一个playp,id为8581,我想向其中添加参与者。我正试图使用RelatedManager的.create()来实现这一点,例如: p.playparticipant_set.create(player_id=2383) Django从中构造: INSERT INTO `api_playparticipant` (`player_id`, `play_id`, `note`) VALUES (2383, 2

我有两个模型:
Play
playampactor
,定义(部分)为:

我的一段代码中有一个play
p
,id为8581,我想向其中添加参与者。我正试图使用RelatedManager的
.create()
来实现这一点,例如:

p.playparticipant_set.create(player_id=2383)
Django从中构造:

INSERT INTO `api_playparticipant` (`player_id`, `play_id`, `note`) VALUES (2383, 2383, '')
这是Django中的一个bug,还是我误用了
.create()

复制粘贴外壳以进行健全性检查:

In [17]: p = Play.objects.get(id=8581)

In [18]: p.id
Out[18]: 8581L

In [19]: p.playparticipant_set.create(player_id=2383)
...
IntegrityError: (1452, 'Cannot add or update a child row: a foreign key constraint fails (`gc/api_playparticipant`, CONSTRAINT `play_id_refs_id_60804ffd462e0029` FOREIGN KEY (`play_id`) REFERENCES `api_play` (`id`))')
从query.log:

5572 Query       INSERT INTO `api_playparticipant` (`player_id`, `play_id`, `note`) VALUES (2383, 2383, '')

您应该在游戏模型中使用与零个或多个参与者相关的ManyToManyField。在这段代码中,您只需要

play.players.add(player)

它不是一只虫子;检查设备;特别是关于多对多关系的额外字段的部分。它规定:

与正常的多对多字段不同,您不能使用
add
create
assignment
(即
beatles.members=[…]
)来创建关系

创建此类关系的唯一方法是创建中间模型的实例


我不明白你的第一个例子怎么会是bug?这种行为完全是直觉的。您的p是一个id为2383的play,您正在调用其相关集合上的create方法。您还指定了一个名为player_id的额外字段,并将其值设为2383。唯一合乎逻辑的是,两个播放id都将是2383(因为这是包含此相关集的播放的id),并且播放器id也将是2383(因为您显式地传入了该值)

您的第二个示例似乎指出了一个bug,但我无法复制它。以下是我的模型:

class Player(models.Model):
    name = models.CharField(max_length=100)

class Play(models.Model):
    title = models.CharField(max_length=100)

class PlayParticipant(models.Model):
    player = models.ForeignKey('Player')
    play = models.ForeignKey('Play')
    note = models.CharField(max_length=100, blank=True)
以下是shell输出:

>>> player1 = Player.objects.create()
>>> player2 = Player.objects.create()
>>> player1.id
2
>>> player2.id
3
>>> play1 = Play.objects.create()
>>> play2 = Play.objects.create()
>>> play1.id
3
>>> play2.id
4
>>> pp1 = play1.playparticipant_set.create(player_id=2)
>>> pp1.play.id
3
>>> pp1.player.id
2

在任何情况下,你为什么要将此发布到SO?Django有一个bug追踪器、两个活跃的官方邮件列表和两个IRC频道。

我无法重现这种行为。使用类似型号,我可以运行:

m = Manufacturer.objects.get(1)
p = m.product_set.create(name='23',category_id=1,price=23,delivery_cost=2)
我得到了
Product
的新实例
p
,其
p.manufacturer
外键等于
m

这是在Django-1.0.2和PostgreSQL上实现的;您使用哪个版本的Django,以及哪个SQL后端


尝试使用两个新的最小模型,其中一个模型上有ForeignKey字段,这应该是可行的;然后使这些模型逐渐接近表现出失败行为的模型。通过这种方式,您可以隔离使其行为不端的单个更改;这一变化是原因的关键。

Meh,不能,因为在关系中有一个额外的字段-一个注释(更新了问题以包含它)。示例与:同样,我想找出bug是什么,而不是解决它(这是我对PlayParticipant.objects.create(…)所做的),但他的帖子说:“我的一段代码有一个PlayP,id为2383”。@oggy:这是一个拼写错误,更正了。抱歉:-/您使用了什么版本的Django?在trunk和1.0.2上进行了测试,使用sqlite3后端。当时我正在使用MySQL 5.0.81运行Django 1.0.2。。。当我有机会的时候,它会自动复制,如果它仍然可以复制的话,会提交错误报告。感谢所有的帮助,oggy:)这不是一个多对多的关系,特别是属性不是多对多,而是一个简单的一对多;文档说明了具有属性的多对多关系的中间模型;你引用的部分与问题完全无关。
m = Manufacturer.objects.get(1)
p = m.product_set.create(name='23',category_id=1,price=23,delivery_cost=2)