【问题标题】:Attempting Join and getting Invalid field name(s) given in select_related: 'audio_links'. Choices are: (none)尝试加入并获取 select_related 中给出的无效字段名称:'audio_links'。选项有:(无)
【发布时间】:2018-09-16 13:13:05
【问题描述】:

我正在尝试对两个表进行联接 - 希望从 ReleasesAll 和 AudioLinks 返回所有数据。

错误

/api/release/0 处的字段错误

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 则查询有效

【问题讨论】:

    标签: python django django-models django-rest-framework


    【解决方案1】:

    您应该将prefetch_related 用于多个关系。 prefetch_related 的参数也应该是 related_name 值,或 audiolinks_set 在你的情况下:

    a_release = self.queryset.prefetch_related('audiolinks_set').get(pk=kwargs['release_id'])
    

    docs:

    select_related 仅限于单值关系 - 外键 并且是一对一的。

    【讨论】:

    • 谢谢。不幸的是,这会返回Cannot find 'audio_links_set' on ReleasesAll object, 'audio_links_set' is an invalid parameter to prefetch_related()
    • @Franco 抱歉。应该是 audiolinks_set 而不是 audio_links_set
    • 再次感谢@neverwalkaloner。这消除了错误 - 它现在返回来自 ReleasesAll 的数据,但它仍然不返回来自 audiolinks 的数据。
    • @Franco 您是否将audiolinks_set 添加为序列化器字段?检查这部分文档:django-rest-framework.org/api-guide/relations/…
    • 序列化器字段是class ReleasesSerializer(serializers.ModelSerializer): class Meta: model = ReleasesAll fields = '__all__'
    猜你喜欢
    • 2019-07-18
    • 2016-08-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-11-29
    • 2016-04-12
    • 2021-01-13
    • 2021-12-31
    相关资源
    最近更新 更多