多对多对象重复

时间:2019-01-24 03:25:35

标签: django

我正在运行一个迁移大量呼叫数据的过程。我有一个代表电话线的模型,另一个代表呼叫者的模型。一个电话线可以有多个呼叫者,而一个呼叫者可以给多个电话线打电话。因此,需要多对多关系。

对于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)

1 个答案:

答案 0 :(得分:1)

将代码更改为

caller, created = Caller.objects.get_or_create(number=number)
caller.phoneline.add(phoneline)

get_or_create方法doc

Django多对多字段会自动检查重复项,如果存在,则不创建。