我正在尝试对两个表进行联接-希望从ReleasesAll和AudioLinks返回所有数据。
错误
/ p / release / 0处的FieldError
在select_related中指定的无效字段名称:“ audio_links”。选择项 是:(无)
models.py
class ReleasesAll(models.Model):
id = models.IntegerField(primary_key=True)
artist = models.CharField(max_length=255)
all_artists = models.CharField(max_length=200)
remixers = models.TextField(blank=True, null=True)
format = models.CharField(max_length=80)
title = models.CharField(max_length=255)
label = models.CharField(max_length=255)
label_no_country = models.CharField(max_length=255)
class Meta:
managed = False
db_table = 'releases_all'
class AudioLinks(models.Model):
release = models.ForeignKey('ReleasesAll', models.DO_NOTHING, db_column='release_id')
track_number = models.IntegerField()
track_name = models.CharField(max_length=500)
url = models.CharField(max_length=500)
m3u_link = models.TextField()
type = models.CharField(max_length=50, blank=True, null=True)
class Meta:
managed = False
db_table = 'audio_links'
views.py
class ListReleaseDetailView(generics.RetrieveUpdateDestroyAPIView):
queryset = ReleasesAll.objects.all()
serializer_class = ReleasesSerializer
def get(self, request, *args, **kwargs):
try:
a_release = self.queryset.select_related('audio_links__release_id').get(pk=kwargs['release_id'])
return Response(ReleasesSerializer(a_release).data)
except ReleasesAll.DoesNotExist:
return Response(
data = {
"message": "{} does not exist".format(kwargs["release_id"])
},
status=status.HTTP_404_NOT_FOUND
如果我删除了select_related
,则查询有效
答案 0 :(得分:3)
您应将prefetch_related
用于多个关系。另外,prefetch_related
的参数应该是related_name
的值,或者在您的情况下为audiolinks_set
:
a_release = self.queryset.prefetch_related('audiolinks_set').get(pk=kwargs['release_id'])
请参见docs:
select_related仅限于单值关系-外键 和一对一。