django - Django 无法识别/找不到 post_save 编辑字段?
问题描述
我正在尝试使用 post_save 模型信号创建一个独特的 SlugField。如果 SlugField 已经存在,则应将一个数字附加到 slug 以使其唯一。
但是,Django 似乎无法识别 SlugField 何时已经存在。
我正在使用单表继承的 MPTT 模型:
class Text(MPTTModel):
type = models.CharField(max_length=255, blank=False) # for STI. Essentially returns the class name.
title = models.CharField(max_length=255, blank=True)
slug = models.SlugField(max_length=255, blank=True)
slug_order = models.CharField(max_length=255, blank=True)
def __init__(self, *args, **kwargs):
super(Text, self).__init__(*args, **kwargs)
# If we don't have a subclass at all, then we need the type attribute to match
# our current class.
if not self.__class__.__subclasses__():
self.type = self.__class__.__name__.lower()
else:
subclass = [
x
for x in self.__class__.__subclasses__()
if x.__name__.lower() == self.type
]
if subclass:
self.__class__ = subclass[0]
else:
self.type = self.__class__.__name__.lower()
class Book(Text):
objects = BookManager()
class Meta:
proxy = True
@receiver(post_save, sender=Book, dispatch_uid="create_book_slug")
def create_book_slug(sender, instance, **kwargs):
slug = slugify(instance.title)
slug_exists = Book.objects.filter(slug=slug).exists() # This always seems to be False
counter = 1
while slug_exists:
counter += 1
new_slug = f"{slug}-{counter}"
slug_exists = Book.objects.filter(slug=new_slug).exists()
if counter > 1:
slug = f"{slug}-{counter}"
instance.slug = slug
我的测试:
b1 = Book.objects.create(title="book book")
b2 = Book.objects.create(title="book book")
self.assertEqual(b1.slug, "book-book") # True
self.assertEqual(b2.slug, "book-book-2") # False - b2.slug gives "book-book"
self.assertEqual(b1.slug, b2.slug) # This is True... obviously not what I want.
self.assertEqual(Book.objects.filter(slug=b1.slug).exists(), True) # False. I have no idea why.
self.assertEqual(Book.objects.filter(title=b1.title).exists(), True) # True. This works.
我必须使用post_save
,因为我实际上想利用默认的 MPTT 字段(、、、lft
等rght
)level
。get_root()
我实际上有另一个名为 STI 的模型Chapter
,它将利用slug_order
:
class Chapter(Text):
objects = ChapterManager()
class Meta:
proxy = True
@receiver(post_save, sender=Chapter, dispatch_uid="create_chapter_slug")
def create_chapter_slug(sender, instance, **kwargs):
print(instance.get_root()) # This works and points to the Chapter's top parent
print(instance.get_root().slug) # This doesn't work and returns nothing
instance.slug = instance.get_root().slug
# slug_order code below works
order = instance.rght - instance.lft
if instance.level == 1:
instance.slug_order = order
else:
instance.slug_order = f"{instance.parent.slug_order}/{order}"
解决方案
看起来post_save
信号实际上并没有保存。
IE
b1 = Book.objects.create(title="book book")
self.assertEqual(b1.slug, "book-book") # True
b1.refresh_from_db()
self.assertEqual(b1.slug, "") # True
并且添加instance.save()
到post_save
接收器会产生递归错误。
我最初的问题是通过使用pre_save
代替create_book_slug
.
我create_chapter_slug
实际上是另一个问题(我计算订单的方法是错误的),我将在另一个线程上发布......
推荐阅读
- python - 想要在 Python 中显示拟合方程
- vb.net - 如何消除程序集的冗余副本
- python - 如何从 GoogleCredentials 获取 projectId?
- c# - 玩家接触地面标记地面时不会死亡
- html - 如何解析 Google 地图嵌入代码以便更改缩放?
- javascript - 如何从非本地 Web 服务器控制 Raspberry Pi?
- java - 从Java中的多个双数(不是数组)中查找最大值?
- database - Mongo:很多集合还是只有一个包含不同类型文档的大型集合?
- java - 如何使用同一个 ColorChooserButton 来执行两个不同的动作
- java - 在工作中itext如何找出坐标文本?