我正在运行一个迁移大量呼叫数据的过程。我有一个代表电话线的模型,另一个代表呼叫者的模型。一个电话线可以有多个呼叫者,而一个呼叫者可以给多个电话线打电话。因此,需要多对多关系。
对于442/444的电话线,下面的代码有效,并且将创建呼叫者并将其链接到电话线或添加到关系中。
但是,在2种情况下,正在创建重复项。也就是说,电话线将存储两个具有相同号码的呼叫者实例。
如何防止这种情况?
class Caller(models.Model):
number = models.CharField(max_length=20)
phoneline = models.ManyToManyField(
PhoneLine,
related_name="callers"
)
class PhoneLine(models.Model):
number = models.CharField(
max_length=20,
default=""
)
try:
caller = Caller.objects.get(number=number)
except ObjectDoesNotExist:
caller = Caller.objects.create(number=number)
caller.save()
if not caller.phoneline.filter(pk=phoneline.pk).exists():
caller.phoneline.add(phoneline)
答案 0 :(得分:1)
将代码更改为
caller, created = Caller.objects.get_or_create(number=number)
caller.phoneline.add(phoneline)
get_or_create
方法doc。
Django多对多字段会自动检查重复项,如果存在,则不创建。