GenericRelatedObjectManager不是JSON serializab

2024-10-08 18:22:09 发布

您现在位置:Python中文网/ 问答频道 /正文

我正在使用Django REST框架,并试图创建一个通用关系。当我试图查看设备模型时,它抛出错误

<django.contrib.contenttypes.fields.GenericRelatedObjectManager object at 0x2b7e6d0> is not JSON serializable

文件相当清楚地指出反向泛型关系应该有效,那么我做错了什么?在

我的模型:

^{pr2}$

序列化程序:

class DeviceModelSerializer(serializers.ModelSerializer):

    generic_model = serializers.PrimaryKeyRelatedField(
        queryset = models.GenericDevice.objects.all()
    )

    class Meta:
        model = models.SSDDeviceModel
        fields = (...other fields..., 'generic_model')

class DeviceModelRelatedField(serializers.PrimaryKeyRelatedField):
    def to_representation(self, value):
        if isinstance(value, models.DeviceModel):
            serializer = DeviceModelSerializer(value)
        else:
            raise Exception('Unexpected device model')
        return serializer.data

class GenericDeviceSerializer(serializers.ModelSerializer):
    device_model = DeviceModelRelatedField(queryset=models.DeviceModel.objects.all())

    class Meta:
        model = models.GenericDevice
        fields = ('device_model')

Tags: 模型fieldsmodel关系valuemodelsdevicegeneric
1条回答
网友
1楼 · 发布于 2024-10-08 18:22:09

我刚才也遇到了这个问题。我想我用下面的代码解决了这个问题,松散地模仿了Django REST docs - Generic Relationships。在

)希望能有所帮助。我是Django新手。如果我能让它更优雅的话,我会更新这个)。在

我的模型:

from django.contrib.auth.models import User
from django.db import models
from django_extensions.db.models import TimeStampedModel
from django.contrib.contenttypes.fields import GenericForeignKey, GenericRelation
from django.contrib.contenttypes.models import ContentType


class TaggedItem(models.Model):
    """
    Tags arbitrary model instances using a generic relation.
    """
    tag_name = models.SlugField()
    content_type = models.ForeignKey(ContentType)
    object_id = models.PositiveIntegerField()
    tagged_object = GenericForeignKey('content_type', 'object_id')
    user_created = models.BooleanField(default=True)

    class Meta:
        verbose_name = 'tag'
        verbose_name_plural = 'tags'

    def __str__(self):
        return self.tag_name 


class Bookmark(TimeStampedModel):
    """
    A bookmark consists of a URL, and 0 or more descriptive tags.
    """
    user = models.ForeignKey(User, verbose_name='user', related_name='bookmarks')
    url = models.URLField()
    title = models.CharField('title', max_length=255)
    description = models.TextField('description', blank=True)
    tags = GenericRelation(TaggedItem)

    class Meta:
        unique_together = ("url", "user")
        verbose_name = 'bookmark'
        verbose_name_plural = 'bookmarks'

    def __str__(self):
        return '%s (%s)' % (self.title, self.user)

我的序列化程序:

^{pr2}$

我的管理员:

from django.contrib import admin
from django.contrib.contenttypes import admin as cadmin

from .models import Bookmark, TaggedItem


class TaggedItemInline(cadmin.GenericTabularInline):
    model = TaggedItem


class BookmarkAdmin(admin.ModelAdmin):
    list_display = ('title', 'url', 'user', )
    list_filter = ('user', )
    search_fields = ['url', 'title']
    inlines = [
        TaggedItemInline,
    ]


class TaggedItemAdmin(admin.ModelAdmin):
    list_display = ('tag_name', )

admin.site.register(Bookmark, BookmarkAdmin)
admin.site.register(TaggedItem, TaggedItemAdmin)

相关问题 更多 >

    热门问题