gpt4 book ai didi

django - 使用反向字段时自动创建一对一关系

转载 作者:行者123 更新时间:2023-12-04 06:13:56 25 4
gpt4 key购买 nike

创建模型的两个实例并使用 OneToOneField 连接它们时,连接会在创建对象时自动创建和保存:

from django.db import models

class MyModel(models.Model):
name = models.CharField(primary_key=True, max_length=255)
next = models.OneToOneField('self', on_delete=models.SET_NULL, related_name='prev', null=True, blank=True)

>>> m2 = MyModel.objects.create(name="2")
>>> m1 = MyModel.objects.create(name="1", next=m2)
>>> m2.prev
<MyModel: 1>
>>> m2.refresh_from_db()
>>> m2.prev
<MyModel: 2>

但是,当创建相同的连接但使用反向字段时,创建也会自动完成,但 不是 保存。
>>> m1 = MyModel.objects.create(name="1")
>>> m2 = MyModel.objects.create(name="2", prev=m1)
>>> m1.next
<MyModel: 2>
>>> m1.refresh_from_db()
>>> m1.next

请注意,最后一条语句不会打印任何内容,因为它返回 None
如何在使用反向字段创建时始终保存关系而无需手动使用 .save()每一次?

最佳答案

实现这一点的简单方法可能是使用 pre_save/post_save 信号,您认为这是一个可行的解决方案。但不确定这个答案的可行性,尝试制作一些模组,看看这是否有效!

from django.db.models.signals import post_save
from django.dispatch import receiver

class MyModel(models.Model):
name = models.CharField(primary_key=True, max_length=255)
next = models.OneToOneField('self', on_delete=models.SET_NULL, related_name='prev', null=True, blank=True)

@receiver(post_save, sender=MyModel)
def mymodel_post_save(sender, instance, **kwargs):
if hasattr(instance, 'prev'): # if prev exists
# now check if prev is added next
if not instance.prev.next: # if next is not present
instance.prev.next = instance
MyModel.objects.filter(
pk=instance.prev.pk
).update(next=instance)

关于django - 使用反向字段时自动创建一对一关系,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43119575/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com