【问题标题】:Query @property values in ManyToMany relationships查询多对多关系中的@property 值
【发布时间】:2021-08-07 23:16:21
【问题描述】:

我需要查询多对多关系中的某些字段。这是设置;

class Yacht(models.Model):
    name = models.CharField(max_length=50)
    multiplier = models.DecimalField(max_digits=5, decimal_places=3)

    def __str__(self):
        return self.name


class Event(models.Model):
    name = models.CharField(max_length=50)
    yachts = models.ManyToManyField(Yacht, through='Result')
    
    
    def __str__(self):
        return self.name


class Result(models.Model):
    yacht = models.ForeignKey(Yacht, on_delete=models.CASCADE)
    event = models.ForeignKey(Event, on_delete=models.CASCADE)
    result = models.FloatField()

    @property
    def result_adjusted(self):
        # returns the adjusted result based on the yacht's multiplier
        return self.result * self.yacht.multiplier

问题:如何查询给定游艇在给定赛事中的调整结果?

【问题讨论】:

    标签: django methods model properties


    【解决方案1】:

    不能查询属性但是可以将属性的逻辑带入查询并使用它。

    假设我们想要 Result 实例,其中 result_adjusted 假设为 6,那么我们将编写如下查询:

    from django.db.models import ExpressionWrapper, F, FloatField
    
    
    results = Result.objects.annotate(
        result_adjusted_value=ExpressionWrapper(
            F('result') * F('yacht__multiplier'),
            output_field=FloatField()
        )
    ).filter(result_adjusted_value=6)
    

    参考资料:

    annotate [Django docs](可替换为alias [Django docs]

    F() expressions [Django docs]

    ExpressionWrapper [Django docs]

    【讨论】:

    • 你会在哪里插入这个逻辑?在模型文件或视图中?
    • @JulienEast 这是一个查询,所以它当然应该驻留在视图中。
    • 另外,这是对已知结果调整的过滤。在大多数情况下,我需要按游艇过滤给定事件。
    • 我最终打算在管理面板中将其用作 TabularInline 表单。是否有可以使用的方法或技术使 result_adjusted 始终作为对象的一部分添加?
    • @JulienEast 你可以使用Custom manager 或者你可以为你的模型管理员指定ModelAdmin.get_queryset
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-10-03
    • 2018-11-02
    • 2015-10-26
    相关资源
    最近更新 更多