Django DRF получение значений ForeignKey в сериализаторе
Я пытаюсь получить все Benchmarks
, связанные с 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', ]
Вы можете определить сериализатор для модели Benchmarks
:
class BenchmarkSerializer(serializers.ModelSerializer):
class Meta:
model = Benchmarks
fields = ['benchmark_score', 'benchmarked_at']
тогда мы можем использовать этот сериализатор в NodeSerializer
:
class NodeSerializer(serializers.ModelSerializer):
benchmark_set = BenchmarkSerializer(many=True)
class Meta:
model = Node
fields = ['earnings_total', 'node_id', 'data',
'online', 'version', 'updated_at', 'created_at', 'benchmark_set']
Примечание: обычно модели Django дается сингулярное имя, поэтому
Benchmark
вместо.Benchmarks
Используйте HyperlinkedModelSerializer следующим образом:
class BenchmarkSerializer(serializers.HyperlinkedModelSerializer):
class Meta:
model = Benchmarks
fields = ['benchmark_score', 'benchmarked_at']
class NodeSerializer(serializers.HyperlinkedModelSerializer):
benchmark_set = BenchmarkSerializer(many=True, read_only=True)
class Meta:
model = Node
fields = ['node_id', 'wallet', 'earnings_total', 'data', 'online',
'version', 'updated_at', 'created_at', 'benchmark_set']