【问题标题】:Changing and saving the data gives Integrity error更改和保存数据会导致完整性错误
【发布时间】:2019-01-26 12:11:35
【问题描述】:

我使用以下定义的模型获得了完整性。当我从 django 管理员进行更改并再次保存数据时会发生这种情况。 该错误由 obj.save() 触发。 错误如下:

Exception Type: IntegrityError at /admin/users/data/1/change/
Exception Value: UNIQUE constraint failed: users_data.id

我怎样才能做到这一点。

class Data(models.Model):
    author = models.ForeignKey(User, null=True, editable=False, on_delete=models.CASCADE)
    address = models.CharField(max_length=300,blank=True,null=True,help_text=("enter the address"))
    contact = models.IntegerField(blank=True,null=True,help_text=("enter the contact"))
    username = models.CharField(max_length=100,blank=True,null=True,help_text=("enter the username"))
    password = models.CharField(max_length=100,blank=True,null=True,help_text=("enter the strong password"))
    creation_date = models.DateTimeField(editable=False,null=True)
    last_modified = models.DateTimeField(editable=False,null=True)

    def save(self,*args, **kwargs):
        if not self.creation_date:
            self.creation_date = timezone.now()
        self.last_modified = timezone.now()

        return super(Data, self).save(self,*args, **kwargs)

    def __str__(self):
        return (self.username)


@receiver(post_save,sender=Data)
def datasaver(sender, instance, **kwargs):
    address = instance.address
    contact = instance.contact
    username = instance.username
    user_password = instance.password

class CustomAdmin(admin.ModelAdmin):

    search_fields = ('first_name', 'email', 'username', )

    def save_model(self, request, obj, form, change):
        obj.author = request.user
        obj.password = ''
        obj.save()

    def get_queryset(self, request):
        qs = super(CustomAdmin, self).get_queryset(request)
        if request.user.is_superuser:
            return qs
        return qs.filter(author=request.user)

【问题讨论】:

  • 您的 post_save 信号处理程序似乎完全没有意义。为什么会有它?
  • 但如果您希望我们提供帮助,您将需要显示完整的回溯。
  • 不要那样做。使用这个creation_date = models.DateTimeField(auto_now=True)last_modified = models.DateTimeField(auto_now_add=True) 并删除你的保存方法
  • 确实解决了问题。谢谢您的帮助。我真的很感激。

标签: django python-3.x django-models django-admin


【解决方案1】:

不要这样做。 Django 提供了一种更好的方法来保存修改日期和创建日期。改用它并删除覆盖的保存方法和后保存信号。

替换

creation_date = models.DateTimeField(editable=False,null=True)
last_modified = models.DateTimeField(editable=False,null=True)

creation_date = models.DateTimeField(auto_now_add=True)
last_modified = models.DateTimeField(auto_now=True)

django datefield optional arguments

【讨论】:

  • 感谢您的帮助。它成功了。非常感谢您的帮助 :)
  • @VishnuChalil 如果有帮助,请将其标记为答案
  • 请注意,auto_now 应该在 last_modified 字段上,auto_now_add 在 creation_date 字段上,否则创建日期字段会不断变化
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2010-11-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-02-14
  • 2018-01-03
  • 1970-01-01
相关资源
最近更新 更多