我遇到了我的主键序列与我的表行不同步的问题.
也就是说,当我插入一个新行时,我得到一个重复的键错误,因为串行数据类型中隐含的序列返回一个已经存在的数字.
这似乎是由导入/恢复不能正确维护序列引起的.
我有一个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)
在这种情况下,创建项目时,信号会触发,我会看到title
该assigned_to
字段的空列表.
保存后如何访问保存的assigned_to
数据?
在Django中提交事务后有没有办法运行一些代码?
我需要向rabbitmq服务器发送一些消息以进行离线处理,但是在提交Django事务之前,消息会传递给消费者.
我的消息是在模型的post_save信号中发送的.我正在寻找的是一种类似的机制,使用信号或其他东西,它将在提交后执行代码(如果事务失败则不执行任何操作).
我没有在Django中找到任何通用的方法.你有什么想法?
我遇到了一个奇怪的问题,我希望这里的某些人能够对此有所了解.
我正在重写模型的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关系的所有手动更改.这与处理表单的方式有关吗?
假设我有这样的模型
class Event(models.Model)
users_count = models.IntegerField(default=0)
users = models.ManyToManyField(User)
Run Code Online (Sandbox Code Playgroud)
如果事件添加/删除某些用户,您会如何建议更新users_count值?
你好,我使用的是 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) django ×5
python ×3
commit ×1
django-orm ×1
m2m ×1
postgresql ×1
primary-key ×1
signals ×1
transactions ×1