Python 带有嵌套字段筛选器的Django模型实例

Python 带有嵌套字段筛选器的Django模型实例,python,django,orm,model,Python,Django,Orm,Model,我有这两种型号: 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(

我有这两种型号:

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

集合用于替换相关对象。您将获得结果,然后重置它们。我不知道为什么?也许你正在尝试更新


集合用于替换相关对象。您将获得结果,然后重置它们。我不知道为什么?也许你正在尝试更新


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

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

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

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

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

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

您所说的中断是什么意思?\@JPG,因为结果将替换为.set()。我希望新任务只在内存中包含筛选结果。确定。我已将损坏/毁坏的替换为重写。我明白了,问题是你不能在内存中编辑它,然后让下游序列化程序使用编辑过的版本,因为它是一个反向外键管理器?您使用的是什么序列化程序?您可能需要调整它。@PeterDeGlopper是的,您是对的。您所说的中断是什么意思?\@JPG,因为结果将被.set()替换。我希望新任务只在内存中包含筛选结果。确定。我已将损坏/毁坏的替换为重写。我明白了,问题是你不能在内存中编辑它,然后让下游序列化程序使用编辑过的版本,因为它是一个反向外键管理器?您使用的是什么序列化程序?您可能需要调整它。@PeterGlopper是的,您是对的。否,我想将此任务传递给序列化程序(序列化程序带有结果)否,我想将此任务传递给序列化程序(序列化程序带有结果)