首页 > 解决方案 > Django DRF 在序列化程序中获取 ForeignKey 值

问题描述

我正在尝试在我的序列化程序中检索Benchmarks与 a 相关的所有内容Node,但我不太确定如何检索它们。我需要做某种反向外键查找吗?也许我的模型制作不正确?

class Node(models.Model):
    node_id = models.CharField(max_length=42, unique=True)
    wallet = models.CharField(max_length=42, null=True, blank=True)
    earnings_total = models.FloatField(null=True, blank=True)
    data = models.JSONField(null=True)
    online = models.BooleanField(default=False)
    version = models.CharField(max_length=5)
    updated_at = models.DateTimeField(null=True, blank=True)
    created_at = models.DateTimeField(auto_now_add=True)


class Benchmarks(models.Model):
    benchmark_score = models.IntegerField(default=0)
    benchmarked_at = models.DateTimeField(null=True, blank=True)
    provider = models.ForeignKey(Node, on_delete=models.CASCADE)

class NodeSerializer(serializers.ModelSerializer):

    class Meta:
        model = Node
        fields = ['earnings_total', 'node_id', 'data',
                  'online', 'version', 'updated_at', 'created_at', ]

标签: pythondjango

解决方案


您可以为模型定义序列化程序Benchmarks

class BenchmarkSerializer(serializers.ModelSerializer):
    
    class Meta:
        model = Benchmarks
        fields = ['benchmark_score', 'benchmarked_at']

然后我们可以在以下位置使用该序列化程序NodeSerializer

class NodeSerializer(serializers.ModelSerializer):
    benchmarks_set = BenchmarkSerializer(many=True)

    class Meta:
        model = Node
        fields = ['earnings_total', 'node_id', 'data',
                  'online', 'version', 'updated_at', 'created_at', 'benchmarks_set']

注意:通常 Django 模型被赋予一个单数名称,所以Benchmark而不是Benchmarks.


推荐阅读