【问题标题】:Why is the Django ORM not saving my objects为什么 Django ORM 不保存我的对象
【发布时间】:2022-01-28 05:44:11
【问题描述】:

我用 DRF 和 vue 创建了一个简单的博客。尝试保存我的类别和标签模型时,Django 返回具有空 id 的对象。但是,当尝试保存我的帖子对象时,它可以正常工作。

有谁知道我在这里做错了什么?

class Category(models.Model):
    name = models.CharField(max_length=100, unique=True)
    slug = models.SlugField(max_length=100, unique=True, null=False)
    posts = models.ManyToManyField(Post, related_name='categories', blank=True)

    def __str__(self):
        return self.name

    def save(self, *args, **kwargs): # new
        if not self.slug:
            self.slug = slugify(self.name)

创建模型后,我不希望有 ID,但一旦我保存模型,ID 应该会显示。这是 manage.py 外壳

如果我通过下面的序列化程序,我会得到同样的结果。

class TagSerializer(serializers.ModelSerializer):
    class Meta:
        model = Tag
        fields = [
            'id', 'name', 'slug'
        ]

我也调用了我的视图集端点来获取相同的数据。如何让 django 生成 id 并保存模型?我也尝试过手动操作(在重新创建测试数据库之后),结果是一样的。我也尝试过从头开始删除和重建迁移。

这里是post模型供参考

class Post(models.Model):

    owner = models.ForeignKey(User, on_delete=models.PROTECT)
    title = models.CharField(max_length=100, unique=True)
    slug = models.SlugField(max_length=100, unique=True, null=False)
    body = models.TextField()
    published = models.BooleanField(default=False)
    published_at = models.DateTimeField(blank=True, null=True)
    created_at = models.DateTimeField(auto_now_add=True)
    updated_at = models.DateTimeField(auto_now=True)

    class Meta:
        ordering = ['-created_at']

    def __str__(self):
        return self.title

    def save(self, *args, **kwargs): # new
        if not self.slug:
            self.slug = slugify(self.title)
        return super().save(*args, **kwargs)

【问题讨论】:

    标签: python django django-models django-rest-framework


    【解决方案1】:

    您没有调用super().save(),因此保存不会触发将Category 对象存储在数据库中的逻辑。您应该通过以下方式实现:

    class Category(models.Model):
        # …
    
        def save(self, *args, **kwargs): # new
            if not self.slug:
                self.slug = slugify(self.name)
            super().save(*args, **kwargs)  # ? save in the database

    【讨论】:

    • 谢谢。我不知道我是怎么错过的。我整天都在看这个
    【解决方案2】:

    模型中的保存功能需要super().save()

    【讨论】:

    • 重复正确和审查的答案
    猜你喜欢
    • 2012-06-11
    • 2010-12-04
    • 2012-02-28
    • 1970-01-01
    • 2018-10-26
    • 2020-05-26
    • 2015-09-19
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多