gpt4 book ai didi

django 为在外键字段模型中创建的新实例自动创建中间模型实例

转载 作者:行者123 更新时间:2023-12-01 15:37:00 26 4
gpt4 key购买 nike

针对以下情况,此问题分为两部分:

我将用例子来描述这个问题:

这些是我的 django 模型:

class Zone(models.Model):
zone_name = models.CharField(max_length = 10)
zone_number = models.CharField(max_length = 10)

class Meta:
ordering = ('zone_name',)

def __unicode__(self):
return self.zone_name


class Stage(models.Model):
stage_number = models.CharField(max_length = 10)
stage_name = models.CharField(max_length = 10)
zones = models.ManyToManyField(Zone, through='ZoneStage')

class Meta:
ordering = ('stage_number',)

def __unicode__(self):
return self.stage_number

@property
def value(self):
return ZoneSubStage.objects.filter(substage__stage=self).aggregate(Sum('value')).get('value__sum', 0)


class ZoneStage(models.Model):
zone = models.ForeignKey(Zone)
stage = models.ForeignKey(Stage)
value = models.PositiveSmallIntegerField(default=0)

class Meta:
ordering = ('zone',)

def __unicode__(self):
return '%s %s' % (self.zone, self.stage)

class SubStage(models.Model):
sub_name = models.CharField(max_length=10)
stage = models.ForeignKey(Stage)
zones = models.ManyToManyField(Zone, through='ZoneSubStage')

def __unicode__(self):
return self.sub_name


class ZoneSubStage(models.Model):
zone = models.ForeignKey(Zone)
substage = models.ForeignKey(SubStage)
value = models.PositiveSmallIntegerField(default=0)

def __str__(self):
return '%s %s' % (self.zone, self.substage)

问题 1:如果我手动创建新的 Zone 实例,如何为所有相关阶段自动创建新的 ZoneStage 实例?

例如我有以下 Stage 实例:S1、S2、S3、S4 并且我创建了新的 Zone 实例“A”。所以,我想自动创建新的 ZoneStage 实例 AS1、AS2、AS3、AS4,如果这样的实例还不存在的话?

问题 2:这是问题 1 的扩展。如果我创建新区域,我想按照问题 1 中的描述自动创建 ZoneStage 实例,而且我想为所有阶段中的所有 SubStage 自动创建 ZoneSubStage 实例,如果这样的 ZoneSubStage 实例尚不存在的话。

我不知道如何开始。我想我也许应该先阅读有关 post_save() 的内容?

最佳答案

子答案:首先,您不想在 ZoneStage 类中添加 zone = models.ForeignKey(Zone),因为您通过 stage = models.ForeignKey(Stage) 获得了此信息;

问题一:您可以在像这样创建阶段后拦截信号(post_save)。

@receiver(post_save, sender=Stage)
def gen_coupon(sender, instance, raw=True, **kwargs):
new_zone_stage = ZoneStage(stage=instance)
new_zone_stage.save()
return kwargs

问题 2:相同的逻辑,但您将发件人更改为当前创建的模型对象

关于django 为在外键字段模型中创建的新实例自动创建中间模型实例,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32287975/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com