在Django上创建批量数据时对模型约束进行迭代



我正在尝试通过不断的实时更新保存API中的数据。因此,来自API的数据将始终容纳我的数据库中的现有数据集。所以我创建了一个unique_together来防止重复。

模型看起来像:

class Autodamb(models.Model, Activity):
user = models.ForeignKey(User, on_delete=models.CASCADE, related_name='highlight', null=True)
title = models.CharField(max_length=300)
url = models.URLField(null=True)
embed_donotuse = models.CharField(max_length=1000)
date = models.CharField(max_length=300)
thumbnail = models.URLField()
home_team_name = models.CharField(max_length=100)
away_team_name = models.CharField(max_length=100)

class Meta:
unique_together = ["title", "date"]

视图.py:

def save_damb_video(request):
r = requests.get('https://www.brainxo.com/com-api/v1/?apid=xxxxxxxxxxx')
# data = json.loads(r)
data = r.json()

for x in data:
title = x["title"]
embed_donotuse = x["embed"]
url = x["url"]
date = x["date"]
thumbnail = x["thumbnail"]
home_team_name = x["side1"]["name"]
away_team_name = x["side2"]["name"]
user = request.user

damb_data = Autodamb.objects.create(title=title,  embed_donotuse=embed_donotuse, url=url, date=date, thumbnail=thumbnail, home_team_name=home_team_name, away_team_name=away_team_name, user=user)

damb_data.save()
return HttpResponse("DAMP API data successfully saved")

问题是,由于一些数据已经存在,整个过程将以unique_together失败。有什么想法吗?如何在保持唯一约束的同时迭代并只保存不存在的数据?

这将忽略已经存在标题和日期组合的行,只插入其余行。

objects = []
for x in data:
...
damb_data = Autodamb(
title=title,
embed_donotuse=embed_donotuse,
url=url, date=date,
thumbnail=thumbnail,
home_team_name=home_team_name,
away_team_name=away_team_name,
user=user
)
objects.append(damb_data)
bulk_create(objects, ignore_conflicts=True)

PS。如果您正在Django中构建API,我建议您查看Django Rest Framework。它有针对这类事情的序列化程序。

最新更新