- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
如果之前已经回答过这个问题但已经搜索了几个小时,我们深表歉意。
我正在尝试对带有 m2m 字段的 django rest 模型进行验证。我有一个分配有角色的模型。如果角色与现有模型重叠并且想抛出验证错误,我有一些逻辑。我已经尝试过 pre_save 信号,但显然 django 直到保存后才分配 m2m(无 ID)。如何访问数据 pre_save?这是模型:
class ActivityFactory (models.Model):
"""
This provides an interval over which ActivityDemands are auto-generated and ActivityStudyHours (note that activity study hours can be obsolete as all of the same information is already stored here) instead of the traditional method of inputing ActivityDemands per month. The product of Activity and ActivityDemand will still create StudySiteWorkloads.
"""
start_date = models.DateField()
end_date = models.DateField()
hours = models.DecimalField(max_digits=5, decimal_places=2)
notes = models.TextField(blank=True, null=True)
activity = models.ForeignKey(Activity, on_delete=models.CASCADE, related_name='activity_factories')
roles = models.ManyToManyField(Role, blank=True, related_name='activity_factories')
study = models.ForeignKey(Study, on_delete=models.CASCADE, related_name="activity_factories")
trend_curve = models.ForeignKey(TrendCurve, on_delete=models.CASCADE, related_name="activity_factories")
slug = AutoSlugField(populate_from='study', db_index=True, unique=True, null=True)
class Meta:
verbose_name_plural = 'Activity Factories'
def __str__(self):
return "%s: %s : %s" % (self.study.study_name, self.activity.activity_name, self.trend_curve.denominator_name)
这是 pre_save:
@receiver(pre_save, sender=ActivityFactory)
def validate_factory(sender, instance, **kwargs):
queryset = ActivityFactory.objects.filter(activity=instance.activity, study=instance.study)
roles=instance.roles.objects.all()
for activity_factory in queryset:
if activity_factory.slug!=instance.slug:
if ((activity_factory.start_date <= instance.start_date <= activity_factory.end_date) or (activity_factory.start_date >= instance.end_date >= activity_factory.end_date)) and bool(set(activity_factory.roles.all()) & set(roles)):
raise serializers.ValidationError({'activity':'Date intervals cannot overlap for a given activity in the same study with the same assigned role'}, code=400)
if activity_factory.activity==instance.activity and activity_factory.hours!=instance.hours and bool(set(activity_factory.roles.all()) & set(roles)):
raise serializers.ValidationError({'activity':'The same activity can not have differing hours assigned to the same role within a study. Consider a new activity or keep hours the same'}, code=400)
最佳答案
我想我可能已经弄明白了。您可以按如下方式使用 m2m_changed 信号:
@receiver(m2m_changed, sender=ActivityFactory.roles.through)
def validate_factory_m2m(sender, instance, **kwargs):
queryset = ActivityFactory.objects.filter(activity=instance.activity, study=instance.study)
roles=instance.roles.all()
for activity_factory in queryset:
if activity_factory.slug!=instance.slug:
if ((activity_factory.start_date <= instance.start_date <= activity_factory.end_date) or (activity_factory.start_date >= instance.end_date >= activity_factory.end_date)) and bool(set(activity_factory.roles.all()) & set(roles)):
instance.delete()
raise serializers.ValidationError({'activity':'Date intervals cannot overlap for a given activity with the same assigned role. Consider removing that role or changing the dates or activity'}, code=400)
if activity_factory.activity==instance.activity and activity_factory.hours!=instance.hours and bool(set(activity_factory.roles.all()) & set(roles)):
raise serializers.ValidationError({'activity':'The same activity can not have differing hours assigned to the same role within a study. Consider a new activity or role, or keep hours the same'}, code=400)
关于对 m2m(多对多)字段的 django pre_save 验证,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53266557/
假设我有一个名为 A 的模型,它有一个名为 name 的字段。如何在 pre_save 信号中获取以前的值和新值? @receiver(pre_save, sender=A) def signal_p
我有一个模型类“Action”,它由其他几个类扩展。我是 django 的新手,假设如果我调用 pre_save.connect(actionFunc, sender=Action) ,则只要调用 A
我的模型中有两个必填字段,我想在 ModelViewSet 的 pre_save 方法中填充它们。尽管将它们设置在那里,但在提交 .create() 请求时,我仍然收到一个错误,指出这两个字段是必需的
我正在使用 Django 信号进行数据反规范化。这是我的代码: # vote was saved @receiver(pre_save, sender=Vote) def update_post_vo
我通过以下方式测试了Django的“pre_save”信号,但都无法捕捉到信号。 $ from django.db.models.signals import pre_save import logg
我有一个 Order (1) 和 OrderLine (n) 模型,这里的订单可以有多个订单行。这都是从 Django-admin 内部运行的,其中 OrderLine设置为 inlines 的一部分
如果在处理 instance 中的数据期间出现问题,我想通知用户。在我的 pre_save接收器功能。 是否可以提高自定义ValidationError从接收器功能?如果没有,我将如何实现这样的事情?
以下是我的模型: class Product(models.Model): product_title = models.CharField(max_length=100, null=Fals
我在 MyModel 上定义了一个 pre_save,它看起来像这样: @receiver(pre_save, sender=MyModel) def _mymodel_pre_save(sender
我想在创建用户之前执行一些自定义操作。我想到了为此使用 pre_save 信号。如果其中一个操作会引发异常,则停止事务、中止创建用户等。 这是要走的路吗?如果在此步骤中出现问题(这是必需的行为),它会
我正在使用 Python mongoengine,我想定义回调,每次更新文档时都会调用它。 from mongoengine import * from mongoengine import sign
我正在 Django 1.6 中开发一个通知应用程序,我想将其他参数传递给 Django 信号,例如 post_save .我尝试使用 functools 中的部分,但没有运气。 from funct
当一个字段发生变化时,我需要执行一些操作。 由于此操作需要使用已保存的对象,因此我无法像这样使用 pre_save 信号: @receiver(pre_save, sender=reservation
我必须执行 multi-aspect type of inheritance from UML在 Django ORM 中。我有 Contract 数据类型,根据客户类型(普通客户或商业客户)可以将其
我有一个用于生成 slug 的自定义字段,并且我在我的模型中使用它。 奇怪的是,我无法弄清楚为什么我在此自定义字段的方法 pre_save 中生成的值没有在当前实例上设置。 我的问题不是关于以不同方式
获得 Django 1.11 应用程序。一切工作正常,除了 pre_save 信号出现奇怪的问题。在我的模型中,我有两个多对多字段,用于计算相关模型中的总成本(带宽和许可证)。 我创建了一个 pre_
我有一个模型: class A(models.Model): number = models.IntegerField() 但是当我调用 A.save() 时,我想确保该数字是质数(或其他条件
class TodoList(models.Model): title = models.CharField(maxlength=100) slug = models.SlugFiel
我有两个模型。当我保存第一个实例时,我需要将这个模型的字段值发送到另一个模型的字段中。 第一个模型: class ModelOne(models.Model): # fields...
如果之前已经回答过这个问题但已经搜索了几个小时,我们深表歉意。 我正在尝试对带有 m2m 字段的 django rest 模型进行验证。我有一个分配有角色的模型。如果角色与现有模型重叠并且想抛出验证错
我是一名优秀的程序员,十分优秀!