如果Django模型的字段中没有定义数据,如何插入特定类别中的数据?

pqwbnv8z  于 2023-01-21  发布在  Go
关注(0)|答案(1)|浏览(124)

我在Django项目中创建了两个模型:CategoryShop。每个店铺可能只有一个类别。如果我没有定义店铺的类别,我希望它在模板的Without category部分。我如何设置默认值?
我的模特:

class Category(models.Model):
    name = models.CharField(max_length=100)
    position = models.IntegerField(unique=True)

    def __str__(self):
        return f'{self.name}'

class DemoShop(models.Model):
    title = models.CharField(max_length=100)
    category = models.ForeignKey(Category, on_delete=models.CASCADE,
                             related_name='Cat')

    def __str__(self):
        return f"{self.title}"

当我写道:

category = models.ForeignKey(Category, on_delete=models.CASCADE, related_name='Cat', default='Without category')

它在我的数据库中没有效果,并且它不会显示在我的模板的Without category部分。如果我没有把一个商店放在某个类别中,我希望它显示在页面的Without category中,如:

Products:
    -lorem;
    -testshop;
Watch:
    -keram;
    -pollop;
Without category:
    (All shop what I haven't define a category in DB)
vvppvyoh

vvppvyoh1#

ForeignKey模型字段默认值是它引用的模型示例的主键(除非您在ForeignKey上设置to_field以指向引用模型的其他字段)。https://docs.djangoproject.com/en/4.1/ref/models/fields/#django.db.models.Field.default
如果你想把DemoShop的默认类别设置为“Without value”,你可以创建一个classmethod,如果存在的话,它会创建/返回名称为“Without category”的Category(我随意地为get_or_create方法选择了position=5参数值):

class Category(models.Model):
   name = models.CharField(max_length=100)
   position = models.IntegerField(unique=True)

   def __str__(self):
       return f'{self.name}'

   @classmethod
   def get_default_pk(cls):
       obj, created = cls.objects.get_or_create(
           name="Without category",
           position=5
       )
       return obj.pk

然后,您可以使用定义的classmethod来获取名称为“Without category”的虚拟类别(假设CategoryDemoShop模型定义在同一个models.py文件中:

class DemoShop(models.Model):
    title = models.CharField(max_length=100)
    category = models.ForeignKey(Category, on_delete=models.CASCADE,
                             related_name='Cat', default=Category.get_default_pk())

如果由于某种原因,您确实不能/不想将名称为“Without category”的伪类别插入到数据库中,您可以在DemoShop模型上设置category字段,使其允许空输入并可为空,然后定义一个自定义方法作为相关类别名称的getter:

class DemoShop(models.Model):
    title = models.CharField(max_length=100)
    category = models.ForeignKey(Category, on_delete=models.CASCADE,
                             related_name='Cat', blank=True, null=True)

    def __str__(self):
        return f"{self.title}"

    def get_category_name(self):
        if self.category is None:
            return "Without category"
        return self.category.name

然后在模板中使用此方法获取DemoShop示例的类别名称。

相关问题