在Django中,从两个不同的表中取出2个不同的值来创建一个slug字段

3
我正在尝试在Django中创建一个slug字段,该字段需要使用来自2个不同表的2个表字段。
最佳方法是什么?
例如: 如果我有一个Restaurant表,其中包含restaurant_name字段和一个Location表,其中包含location_name字段,如何从这两个值创建slug字段?也就是说,从restaurant_name + location_name生成slugfield。
编辑: 如果可能,我想在解决方案中使用AutoSlug Field。例如,这里是使用单个字段进行slugify的实现:
class Cuisine(models.Model):
    name = models.CharField(max_length=100)
    name_slug = AutoSlugField(populate_from='name', unique=True, null=True)
    def __str__(self):
        return self.name

这两个表之间有什么关联? - Mike Covington
Location表中有一个外键,该字段名为“restaurant”。 - Michael Smith
1个回答

3
这很简单,你不需要为AutoSlugField编写特殊的处理程序。
from django.utils.text import slugify


class Restaurant(models.Model):
    name = models.CharField(max_length=100)
    location = models.ForeignKey(Location)
    name_slug = models.AutoSlugField(populate_from='name', unique=True, null=True)

    def save(self, *args, **kwargs):
         '''
         Assuming that you don't have a slug field on your other model
         This will simply add the extra slug to your restaurant name.
         Personally, i would also add a slug field to the location table so you 
         simply call location.slug and don't have to slugify()
         '''
        self.name_slug += slugify(self.location.name)
        super(Restaurant, self).save(*args, **kwargs)

这里需要记住的一件事情是,django-autoslug没有在他们的AutoSlugField中提到任何特殊的max_length,因此可能会出现该字段的max_length问题。

因此,一个替代方案比上述方案更简单:

from django.utils.text import slugify


class Restaurant(models.Model):
    name = models.CharField(max_length=100)
    location = models.ForeignKey(Location)
    # sum both fields max_length for the slug
    name_slug = models.SlugField(max_length=200, unique=True, null=True)

    def save(self, *args, **kwargs):
        # just check if name or location.name has changed
        self.name_slug = '-'.join((slugify(self.name), slugify(self.location.name)))
        super(Restaurant, self).save(*args, **kwargs)

p.s: 您可以使用正确的模型名称进行编辑。


1
因为 self.name_slug += ... 这一行,每次保存后 self.name_slug 都会不断增加,对吗? - Mike Covington
谢谢,我在注释中指定了它,我做了很多假设。 - HassenPy
为什么你的名字没有出现在编辑中?我只是通过将“+=”更改为“=”来进行了改进。 - HassenPy
很奇怪。不确定。我确实收到了编辑加2的通知。 - Mike Covington
1
好的,感谢您的指导。我最终使用了您的“保存逻辑”的一部分,然后按照这篇文章创建了唯一的slug:https://dev59.com/questions/02jWa4cB1Zd3GeqPsJms - Michael Smith
显示剩余4条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接