我當前保存文章的代碼會保存新文章并列印“帖子已經存在!” 如果找到重復項,但它仍在進行資料庫呼叫,因此現在我的文章表中存在 ID 空白,因為重復文章未保存導致的錯誤保存。如果發現重復項以保持我的文章 ID 的一致性,我如何改進我的代碼以防止保存操作?
if not Posts.objects.filter(title=post_title, slug=post_slug).exists():
post = Posts(
title = post_title,
link = post_link,
summary = post_summary,
image_url = image_link,
slug = post_slug,
pub_date = date_published,
guid = item.guid,
feed_title = channel_feed_title,
feed_link = channel_feed_link,
feed_description = channel_feed_desc,
source_id = selected_source_id,
category_id = selected_category_id
)
post.save()
for i in range(len(article_list)):
post_tags = post.tags.add(article_list[i])
else:
print("The Post Already Exists! Skipping...")
我不斷收到這樣的錯誤:
django.db.utils.IntegrityError: duplicate key value violates unique constraint "Posts_posts_slug_key" DETAIL: Key (slug)=() already exists.
我的模特
class Categories(models.Model):
category_name = models.CharField(max_length=500, verbose_name='Categories')
date_created = models.DateField(auto_now_add=True, verbose_name='Date Created')
last_modified = models.DateField(auto_now=True, verbose_name='Last Modified')
def __str__(self):
return f"{self.category_name}"
class Meta:
verbose_name_plural = 'Categories'
class Source(models.Model):
name = models.CharField(max_length=500, verbose_name='Website Name')
feed_url = models.URLField(max_length=500, verbose_name='RSS Feed Link')
date_created = models.DateField(auto_now_add=True, verbose_name='Date Created')
last_modified = models.DateField(auto_now=True, verbose_name='Last Modified')
def __str__(self):
return f"{self.name}"
class Meta:
verbose_name_plural = 'Feed Sources'
class Posts(models.Model):
title = models.CharField(max_length=500, verbose_name='Post Title')
link = models.URLField(max_length=500, verbose_name='Post Link')
summary = models.TextField(verbose_name='Post Summary')
image_url = models.URLField(max_length=500, null=True, verbose_name='Post Image URL')
slug = models.SlugField(unique=True, max_length=500)
tags = TaggableManager()
pub_date = models.DateTimeField(verbose_name='Date Published')
guid = models.CharField(max_length=500, verbose_name='Guid Code', null=True)
feed_title = models.CharField(max_length=500, verbose_name='Feed Channel Title')
feed_link = models.URLField(max_length=500, verbose_name='Feed Channel Link')
feed_description = models.TextField(verbose_name='Feed Channel Description')
date_created = models.DateField(auto_now_add=True, verbose_name='Date Created')
last_modified = models.DateField(auto_now=True, verbose_name='Last Modified')
source = models.ForeignKey(Source, on_delete=models.CASCADE, verbose_name='Source')
category = models.ForeignKey(Categories, on_delete=models.CASCADE, verbose_name='Category')
def __str__(self):
return f"{self.title} - {self.feed_title}"
class Meta:
verbose_name_plural = 'Posts'
uj5u.com熱心網友回復:
由于您只有slug一個唯一欄位,因此您必須檢查是否已經存在具有相同 slug 的帖子。如果沒有,請創建它。您現在遇到的問題是您還檢查了標題(作為 AND 運算子)。這可能會導致您認為該帖子不存在,但您仍然無法將其添加到資料庫中,因為 slug 已經存在。但不是標題不同的蛞蝓。這意味著您只需要洗掉查詢中的標題:
Posts.objects.filter(slug=post_slug).exists()
以下是根據我之前的回答(https://docs.djangoproject.com/en/4.0/ref/models/querysets/#get-or-create)解決問題的更多方法:
try:
post = Posts.objects.get(slug=post_slug)
except Posts.DoesNotExist:
post = Posts(title=post_title, link=...)
post.save()
在這里,對于并發請求,可能會多次嘗試保存具有相同引數的 Post。為了避免這種競爭條件,可以使用 get_or_create() 重寫上面的示例,如下所示:
obj, created = Posts.objects.get_or_create(
slug=post_slug,
defaults={'title':post_title, 'link': ...},
)
轉載請註明出處,本文鏈接:https://www.uj5u.com/qukuanlian/405624.html
標籤:
