【问题标题】:djangorestframework:get the value with manytomanyfielddjangorestframework:使用manytomanyfield获取值
【发布时间】:2014-11-12 11:17:12
【问题描述】:

我是 django rest 框架的新手
我对如何使用 ManyToManyField 获取关系值有疑问

这是我的代码:

models.py

class Movie(models.Model):
    link = models.URLField()
    title = models.CharField(max_length=255, null=True)

class MovieTheater(models.Model):
    movietheater = models.ManyToManyField(Movie,null=True,blank=True,through="MovieShowtime")
    movie_theater = models.CharField(max_length=255, null=True)     
    tel = models.CharField(max_length=255, null=True)     

class MovieShowtime(models.Model):
    theater = models.ForeignKey( MovieTheater, null=True,blank=True,related_name = 'theater' )
    movie = models.ForeignKey( Movie, null=True,blank=True,related_name = 'movie' )
    time = models.TextField(null=True,blank=True)      

serialize.py

class MovieSerializer(serializers.ModelSerializer):
    class Meta:
        model = Movie
        fields = ('link', 'title')

class MovieShowtimeSerializer(serializers.ModelSerializer):
    movieid = serializers.CharField(source='movie_id')   
    theaterid = serializers.CharField(source='theater_id')  

    class Meta:
        model = MovieShowtime
        fields = ('movieid', 'theaterid','time' )       

class TheaterSerializer(serializers.ModelSerializer):
    movieintheater = serializers.HyperlinkedRelatedField(many=True,source='movietheater', view_name='movie_detail')
    time = MovieShowtimeSerializer(many=True, read_only=True, source='theater')

    class Meta:
        model = MovieTheater
        fields = ('movieintheater','time','tel' )

views.py

class TheaterList(object):
    queryset = MovieTheater.objects.all()
    serializer_class = TheaterSerializer

当我去url(r'^theaters/$', TheaterList.as_view())

结果是这样的:

{
    "movieintheater": [
        "http://127.0.0.1:8000/movies/159", 
        "http://127.0.0.1:8000/movies/160", 

    ], 
    "time": [
        {
            "movieid": 159, 
            "theaterid": 3, 
            "time": "12 : 50 PM | 06 : 20 PM"
        }, 
        {
            "movieid": 160, 
            "theaterid": 3, 
            "time": "12 : 40 PM | 04 : 50 PM | 09 : 00 PM"
        },      
    ], 
    "tel": "1234567890"
}, 

我想知道如何显示这样的值:
直接将数字(movieid,theatid) 替换为模型信息
请教我。谢谢

    {
    "movieintheater": [
        "http://127.0.0.1:8000/movies/159", 
        "http://127.0.0.1:8000/movies/160",  
    ], 
    "time": [
        {
            "movieid.title": 'movie1', 
            "theaterid": 3, 
            "time": "12 : 50 PM | 06 : 20 PM"
        }, 
        {
            "movieid.title": 'movie2', 
            "theaterid": 3, 
            "time": "12 : 40 PM | 04 : 50 PM | 09 : 00 PM"
        },      
    ], 
    "tel": "1234567890"
}, 

【问题讨论】:

    标签: django django-rest-framework


    【解决方案1】:

    Django REST Framework 中的字段source 可以跨越关系,因此您可以获取相关对象的属性并将其用于字段。

    class MovieShowtimeSerializer(serializers.ModelSerializer):
        title = serializers.CharField(source='movie.title')   
        theaterid = serializers.CharField(source='theater_id')  
    
        class Meta:
            model = MovieShowtime
            fields = ('movieid', 'theaterid','time', )   
    

    您必须使用虚线路径作为source,因此movie.title 将为您提供相关movietitle。不过,您可能对更多领域感兴趣,在这种情况下,您可能比 nesting another serializer 更好,就像您已经为演出时间所做的那样。

    【讨论】:

    • 非常感谢。我现在可以继续前进了!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-07-22
    • 2019-06-10
    • 2022-01-10
    • 2016-08-03
    • 1970-01-01
    • 2021-10-30
    • 2017-05-22
    相关资源
    最近更新 更多