简体   繁体   English

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

[英]how to display tabularinline in api django rest framework?

I am with the demand of a system to manage the schedule of a cinema and to generate an api. 我需要一个用于管理电影时间表和生成api的系统的需求。

models.py models.py

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.py 管理员

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']

serializer.py 序列化器

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.py views.py

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()

I'm having trouble getting the movie times displayed on the display. 我无法在显示器上显示电影时间。 I did based on the documentation of nested relationships, but the inline tabular part does not work: schedule is not displayed. 我是基于嵌套关系的文档完成的,但是内联表格部分不起作用:不显示时间表。

在此处输入图片说明

I would like api to generate the following: 我希望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"
    }
]

The problem you are likely hitting is that DRF is looking for a field or a property on your Exhibition model called schedule but this doesn't exist. 您可能遇到的问题是DRF正在您的Exhibition模型中寻找名为schedule的字段或属性,但这不存在。

I don't believe DRF can handle a reverse relation using just a field definition, you have to be more specific. 我不相信DRF只能使用字段定义来处理反向关系,您必须更加具体。 Luckily DRF does make it easy to be more specific. 幸运的是,DRF确实可以使其变得更加具体。

You can make use of the SerializerMethodField . 您可以使用SerializerMethodField

For example: 例如:

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()]

It work for me. 它对我有用。 Thank you. 谢谢。 Take in addition for one_to_one relations. 除了一对一关系。 )) ))

@staticmethod
def get_picture(obj):
    return PictureSerializer(obj.picture).data if hasattr(obj, 'picture') else 'no_picture_found'

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM