相关疑难解决方法(0)

如何在postgres不同步时重置postgres的主键序列?

我遇到了我的主键序列与我的表行不同步的问题.

也就是说,当我插入一个新行时,我得到一个重复的键错误,因为串行数据类型中隐含的序列返回一个已经存在的数字.

这似乎是由导入/恢复不能正确维护序列引起的.

postgresql primary-key database-sequence

482
推荐指数
17
解决办法
23万
查看次数

Django从post_save信号访问ManyToMany字段

我有一个Django模型,我想在保存后或刚刚保存后修改对象权限.我尝试了一些解决方案,post_save信号似乎是我想要做的最佳候选者:

    class Project(models.Model):
        title = models.CharField(max_length=755, default='default')
        assigned_to = models.ManyToManyField(
            User, default=None, blank=True, null=True
        )
        created_by = models.ForeignKey(
            User,
            related_name="%(app_label)s_%(class)s_related"
        )


    @receiver(post_save, sender=Project)
    def assign_project_perms(sender, instance, **kwargs):
        print("instance title: "+str(instance.title))
        print("instance assigned_to: "+str(instance.assigned_to.all()))
Run Code Online (Sandbox Code Playgroud)

在这种情况下,创建项目时,信号会触发,我会看到titleassigned_to字段的空列表.

保存后如何访问保存的assigned_to数据?

django django-signals django-models

29
推荐指数
2
解决办法
1万
查看次数

在Django中提交事务后运行代码

在Django中提交事务后有没有办法运行一些代码?

我需要向rabbitmq服务器发送一些消息以进行离线处理,但是在提交Django事务之前,消息会传递给消费者.

我的消息是在模型的post_save信号中发送的.我正在寻找的是一种类似的机制,使用信号或其他东西,它将在提交后执行代码(如果事务失败则不执行任何操作).

我没有在Django中找到任何通用的方法.你有什么想法?

django signals transactions commit

17
推荐指数
3
解决办法
1万
查看次数

使用Django admin时,ManyToMany字段未保存

我遇到了一个奇怪的问题,我希望这里的某些人能够对此有所了解.

我正在重写模型的save()方法,以便在运行super()之后向ManyToMany字段添加一些值.我的问题是,当我在Django admin中保存时,值似乎被添加到关系中,但然后再次为空.

但是,如果我这样做,manage.py shell它没有问题.

我已经在那里放了两个打印语句,无论我是通过Django admin还是通过shell运行它,它们都会产生完全相同的输出.

class Store(models.Model):
    holidays = models.ManyToManyField(StoreHoliday, blank=True)
    copy_holidays_from = models.ForeignKey('Store', blank=True, null=True)

    def save(self):
        print '====  BEFORE SAVE:', self.holidays.all()
        super(Store, self).save()
        self.copy_holidays()
        print '====  AFTER SAVE:', self.holidays.all()

    def copy_holidays(self):
        if self.pk and self.copy_holidays_from:
            self.holidays.clear()
            for h in self.copy_holidays_from.holidays.all():
                self.holidays.add( h )
Run Code Online (Sandbox Code Playgroud)

这是print声明的输出:

====  BEFORE SAVE: []
====  AFTER SAVE: [<StoreHoliday: 10 Mar 2010, Chuck Norris birthday (Closed)>]
Run Code Online (Sandbox Code Playgroud)

有没有人对可能导致这种情况的原因有任何建议?

编辑:当通过管理界面保存时,Django似乎丢弃了save()中m2m关系的所有手动更改.这与处理表单的方式有关吗?

python django django-orm m2m

11
推荐指数
1
解决办法
5441
查看次数

Django manytomany信号?

假设我有这样的模型

class Event(models.Model)
    users_count = models.IntegerField(default=0)
    users = models.ManyToManyField(User)
Run Code Online (Sandbox Code Playgroud)

如果事件添加/删除某些用户,您会如何建议更新users_count值?

python django django-signals django-models

5
推荐指数
1
解决办法
4024
查看次数

在 Django 1.9 中保存时将用户添加到组

你好,我使用的是 Django 1.9。尝试在创建或保存时将用户添加到组。使用 user.groups 或 groups.user_set.add 都不起作用,请与下面的 pre-save 和 post-save 混合搭配。

这些答案对我不起作用,所以这不是一个骗局: 在 Django 创建时将用户添加到组将用户
添加到 django 中的组
将用户添加到 Django 中的组

我已经在保存前和保存后处理程序中尝试了这两种方法。

@receiver(pre_save, sender=User)
def user_presave_handler(sender, instance, **kwargs):
    if instance.is_staff and not instance.is_superuser:
        # Grant all permissions
        try:
            instance.groups.add(Group.objects.get(name='staff_user'))
        except Group.DoesNotExist:
            pass

@receiver(post_save, sender=User)
def user_postsave_handler(sender, instance, **kwargs):
    if instance.is_staff and not instance.is_superuser:
        try:
            g = Group.objects.get(name='staff_user')
        except Group.DoesNotExist:
            pass
        else:
            g.user_set.add(instance)
            g.save()
Run Code Online (Sandbox Code Playgroud)

哪里可以混用什么方法,我试过了。我在测试中不使用不止一种方法。点击用户管理页面上的保存按钮后,用户不会显示在组中。

我仔细检查了处理程序是否被调用,用户逻辑是否正确等。

是我做错了什么,还是在 1.9 中改变了一些东西以打破旧方法?

谢谢!

编辑:对于那些询问的人,该组是这样创建的:

group, __ = Group.objects.get_or_create(name='staff_user')

permissions = Permission.objects.all()
for p in …
Run Code Online (Sandbox Code Playgroud)

python django

5
推荐指数
1
解决办法
2709
查看次数