如何在api django rest框架中显示tabularinline?

问题描述 投票:0回答:2

我满足了系统管理电影时间表和生成api的需求。

models.朋友

class Movie(models.Model):
    title = models.CharField('título', max_length=250)
    synopsis = models.TextField('sinopse', max_length=500)
    year = models.IntegerField('ano')
    # ... # 

class Exhibition(models.Model):
    movie = models.ForeignKey(Movie, verbose_name='Filme')
    start = models.DateField('Início')
    finish = models.DateField('Encerramento')

class Schedule(models.Model):
    CINE_DERBY = 'CD'
    CINE_CASAFORTE = 'CCF'

    CINEMA = (
        (CINE_CASAFORTE, 'Cinema Casa Forte'),
        (CINE_DERBY, 'Cinema Derby')
    )

    data = models.DateTimeField('data')
    local = models.CharField('local', max_length=5, choices=CINEMA)
    exhibition = models.ForeignKey(Exhibition, verbose_name='Em cartaz')

admin.朋友

class ScheduleInline(admin.TabularInline):
    model = Schedule
    extra = 1

class MovieModelAdmin(admin.ModelAdmin):
    list_display = ['title', 'synopsis', 'year']

class ExhibitionModelAdmin(admin.ModelAdmin):
    inlines = [ScheduleInline]
    list_display = ['movie', 'start', 'finish']

serialize人.朋友

class MovieSerializer(serializers.ModelSerializer):

    class Meta:
        model = Movie
        fields = '__all__'
        depth = 1

class ScheduleSerializer(serializers.ModelSerializer):

    class Meta:
        model = Schedule
        fields = ['id', 'data', 'local', 'exhibition']
        depth = 1

class ExhibitionSerializer(serializers.ModelSerializer):
    movie = MovieSerializer(read_only=True)
    movieId = serializers.PrimaryKeyRelatedField(write_only=True, 
                                                 queryset=Movie.objects.all(),
                                                 source='movie')
    schedule = ScheduleSerializer(many=True, read_only=True)

    class Meta:
        model = Exhibition
        fields = ['movie', 'movieId', 'start', 'finish', 'schedule']

views.朋友

class MovieListViewSet(viewsets.ModelViewSet):
    serializer_class = MovieSerializer
    queryset = Movie.objects.all()

class ScheduleListViewSet(viewsets.ModelViewSet):
    serializer_class = ScheduleSerializer
    queryset = Schedule.objects.all()

class ExhibitionListViewSet(viewsets.ModelViewSet):
    serializer_class = ExhibitionSerializer
    queryset = Exhibition.objects.all()

我无法在显示屏上显示电影时间。我根据嵌套关系的文档做了,但内联表格部分不起作用:不显示计划。

enter image description here

我想api生成以下内容:

[
    {
        "movie": {
            "id": 1,
            "title": "Vingadores: Guerra Infinita",
            "synopsis": "Homem de Ferro, Thor, Hulk e os Vingadores se unem para combater seu inimigo mais poderoso, o maligno Thanos. Em uma missão para coletar todas as seis pedras infinitas, Thanos planeja usá-las para infligir sua vontade maléfica sobre a realidade.",
            "year": 2018,
        },
        "schedule": [
            {
                "id": 1,
                "data": "2018-04-26T14:00:00Z",
                "local": "CFD",
            },
            {
                "id": 2,
                "data": "2018-05-03T20:00:00Z",
                "local": "CFCF",
            },
        ],
        "start": "2018-04-30",
        "finish": "2018-08-24"
    }
]
django django-models django-rest-framework
2个回答
2
投票

您可能遇到的问题是DRF正在寻找Exhibition模型上的字段或属性schedule,但这不存在。

我不相信DRF只使用字段定义来处理反向关系,您必须更具体。幸运的是,DRF确实更容易更具体。

你可以使用SerializerMethodField

例如:

class ExhibitionSerializer(serializers.ModelSerializer):
    movie = MovieSerializer(read_only=True)
    movieId = serializers.PrimaryKeyRelatedField(write_only=True, 
                                             queryset=Movie.objects.all(),
                                             source='movie')

    schedule = serializers.SerializerMethodField()

    class Meta:
        model = Exhibition
        fields = ['movie', 'movieId', 'start', 'finish', 'schedule']

    def get_schedule(self, obj):
        return [ScheduleSerializer(s).data for s in obj.schedule_set.all()]

0
投票

它对我有用。谢谢。另外还有one_to_one关系。 ))

@staticmethod
def get_picture(obj):
    return PictureSerializer(obj.picture).data if hasattr(obj, 'picture') else 'no_picture_found'
© www.soinside.com 2019 - 2024. All rights reserved.