【问题标题】:Django model instance with nested field filter带有嵌套字段过滤器的 Django 模型实例
【发布时间】:2020-03-19 11:41:25
【问题描述】:

我有这两个模型:

class Task(models.Model):
    pass

class Result(models.Model)
    task = models.ForeignKey('tasks.Task', related_name='results')
    enabled = models.BooleanField('enabled', default=False)

我想为我的临时计算获得过滤结果的任务:

task = Task.objects.first()
results = task.results.filter(enabled=True)
task.results.set(results)

这是工作代码,但第一次使用后任务结果将被重写。如何在不重写 task.results 的情况下获得过滤结果的新任务?我只需要将更改后的任务实例保存在内存中。


我的最后一点是将任务传递给序列化程序。但在我看来,序列化程序必须序列化并且不要过滤某些东西。因为在其他子模块中过滤的上下文可能不同。

class ResultSerializer(DynamicFieldsMixin, ModelSerializer):
    class Meta:
        model = Result


class TaskResultsSerializer(ModelSerializer):
    results = ResultSerializer(many=True, read_only=True)
    class Meta:
        model = Task

【问题讨论】:

  • 你说的broken是什么意思?\
  • @JPG 因为结果将被 .set() 替换。我只想在内存中有过滤结果的新任务。
  • 好的。我已经替换了损坏/破坏来重写。希望它很清楚。
  • 我明白了——所以问题是你不能只在内存中编辑它,然后让下游序列化程序使用编辑后的版本,因为它是一个反向外键管理器?你用的是什么序列化器?您可能需要对其进行调整。
  • @PeterDeGlopper 是的,你是对的。

标签: python django orm model


【解决方案1】:

Set 用于替换相关对象。你得到结果,然后重置它们。我不确定为什么?也许您正在尝试进行更新?

https://docs.djangoproject.com/en/2.2/ref/models/querysets/#django.db.models.query.QuerySet.update

【讨论】:

  • 不,我想将此任务传递给序列化程序(序列化程序有结果)
【解决方案2】:

从您选择的序列化程序类来看,您似乎在使用 Django REST 框架进行序列化。如果这是正确的,我将通过在 Task 模型上声明一个可调用来处理此问题,该模型返回您想要包含的结果,然后为该可调用显式指定一个序列化程序字段。例如:

class Task(models.Model):
    def enabled_results(self):
        return self.results.filter(enabled=True)

class TaskResultsSerializer(ModelSerializer):
    results = ResultSerializer(source='enabled_results', many=True, read_only=True)
    class Meta:
        model = Task

这是未经测试的,但它看起来应该可以工作。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2018-10-28
    • 2011-06-04
    • 2015-09-06
    • 1970-01-01
    • 2015-09-30
    • 2018-05-13
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多