【问题标题】:How to save a queryset? [closed]如何保存查询集? [关闭]
【发布时间】:2019-10-15 18:49:01
【问题描述】:

我想知道如何将我的查询集保存在数据库中:

def data_min(self):
        qs1 = Csr.objects.values_list('value_base')
        qs2 = Modelb.objects.filter(Q(limit_a__gte=qs1) & (Q(limit_b__lte=qs1))).distinct().values_list('limit_b')
        qs3 = qs2[0]
        return qs3

这个函数返回我:

<QuerySet [(Decimal('133.22'),)]>

现在我的问题是如何将它保存在“bdata_superior”字段中的模型中:

class Csr(models.Model):
tarifa_cobro = models.ForeignKey(Tarifa_Sem, on_delete=models.CASCADE, null=True, blank=True)
value_base = models.DecimalField(max_digits=10, decimal_places=2, null=True, blank=True)
bdata_superior = models.DecimalField(max_digits=10, decimal_places=2, null=True, blank=True)
data_inferior = models.DecimalField(max_digits=10, decimal_places=2, null=True, blank=True)

class Modelb(models.Model):
    limit_a = models.DecimalField(max_digits=10, decimal_places=2)
    limit_b = models.DecimalField(max_digits=10, decimal_places=2)

问题是当我保存它时,我得到以下错误:

conversion from method to Decimal is not supported

def save(self, *args, **kwargs):
        self.bdata_superior = self.data_min
        super (Crs, self).save(*args, **kwargs)

【问题讨论】:

  • 这个 Stack Overflow 站点是一个仅限英文的站点。对于其他语言,请访问其他堆栈溢出站点,例如https://es.stackoverflow.com/
  • 你能详细说明一下这个问题吗?
  • 你应该保存模型。 Csr.objects.create(tarifa_cobro_id=1, bdata_superior=1.0, data_inferior=2.0)
  • 请分享Modelb的定义。并且您要将其连接到记录还是记录中的字段值?
  • 我想覆盖save方法保存在Crs类的“bdata_superior”字段中

标签: python django django-queryset


【解决方案1】:

调用data_min函数然后保存,返回值给self.bdata_superior,你现在把函数赋值给self.bdata_superior

def save(self, *args, **kwargs):
        self.bdata_superior = self.data_min()
        super (Crs, self).save(*args, **kwargs)

【讨论】:

  • 我刚刚测试了你所说的,现在我得到了错误:异常类型:ValueError异常值:参数必须是长度为3的序列
  • 你能把堆栈跟踪吗?再解释一下,比如它是从哪个函数产生的?
【解决方案2】:

我更新了对这个帖子的回复。

首先更新我的 qs2,错误显示给我,因为我试图保存查询集,然后是一个元组,以访问我的查询集的值,只需在 values_list () 方法中添加 flat = True 参数和在 [0] 位置访问我的元组的第一个值

这是我更新的函数

def data_min(self):
    qs1 = Csr.objects.values_list('base_gravada')
    qs2 = Modelb.objects.filter
    (Q(limit_a__gte=qs1) & 
     Q(limit_b__lte=qs1))
     .distinct().values_list('limit_b', flat=True)[0]

以及保存方法

def save(self, *args, **kwargs):
    self.bdata_superior = self.data_min()
    super (Calculadora_isr, self).save(*args, **kwargs)

非常感谢@harshil9968 所做的一切

【讨论】:

    猜你喜欢
    • 2018-01-18
    • 2017-04-20
    • 2020-06-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-12-31
    相关资源
    最近更新 更多