Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/macos/8.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:如何避免每次保存时重新分配ForeignKey?_Django_Django Database - Fatal编程技术网

Django:如何避免每次保存时重新分配ForeignKey?

Django:如何避免每次保存时重新分配ForeignKey?,django,django-database,Django,Django Database,我想保存A对象和B对象A有一个指向B的外键B有一个指向a的OneToOneField。是否有一种方法可以避免在每次保存之间重新分配变量?或者有更好的方法 # The models a and b were created earlier in code # a.b = b Was already set earlier in code # b.a = a Was already set earlier in code with transaction.commit_on_success():

我想保存
A
对象和
B
对象
A
有一个指向
B
的外键<代码>B有一个指向
a
的OneToOneField。是否有一种方法可以避免在每次保存之间重新分配变量?或者有更好的方法

# The models a and b were created earlier in code
# a.b = b  Was already set earlier in code
# b.a = a  Was already set earlier in code
with transaction.commit_on_success():
    a.save() # pk created for a
    b.a = a  # attach a.pk to b
    b.save() # pk created for b
    a.b = b  # attach b.pk to a
    a.save() # re-save a to database
“A有一把外国钥匙给B,B有一把一角的钥匙给A。”我不认为这是建立关系的方式。您可以将B设置为a的外键,然后使用B.a_set.all()从B访问a

根据以下模型定义,本书与出版商是一对多(ForeignKey),与作者是多对多。(这个~~~~只是指与模型之间的关系无关的其他东西)

然后,您可以访问给定书籍的出版商和作者,如下所示:

b = Book.objects.get(id=50)
publisher1 = b.publisher # publisher object for a given book
author_set = b.authors.all() # query set of authors for a given book
您可以实现反向关系(在上面的模型中没有明确定义)


每次更新对象字段时,都需要调用
save()
将其保存到数据库中,但在执行此操作之前,不需要重新分配ForeignKey或任何其他字段。如果这对你不起作用,可能是因为模特们之间的关系很古怪。我不是100%确定,但我认为对象获得(新)主键的唯一时间是它第一次保存到数据库,然后这就是它的第一个pk。

您是正确的,pk只在第一次保存模型时创建(不幸的是,这并不意味着需要更少的编码:()。我有一个OneToOneField的原因是很容易跟踪上次创建的模型。如果我没有这个OneToOneField,那么我必须使用B的反向访问,这需要每次都进行数据库搜索。浪费了计算和数据库访问。
B.a.order\U by('created')[-1]
b = Book.objects.get(id=50)
publisher1 = b.publisher # publisher object for a given book
author_set = b.authors.all() # query set of authors for a given book
p = Publisher.objects.get(name='Apress Publishing')
p.book_set.all() # query set of books for a given publisher
publisher1.book_set.all() # set of books for the publisher from above.
a = Author.objects.get(name="JK Rowling")
a.book_set.all() # query set of books for a given author