djangorestframework:用manytomanyfield获取值

时间:2014-11-12 01:51:55

标签: django django-rest-framework

我是django休息框架的新成员 我有问题如何使用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,movieid)替换为模型的信息
请教我。谢谢

    {
    "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"
}, 

1 个答案:

答案 0 :(得分: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会获得相关title的{​​{1}}。您可能对更多领域感兴趣,在这种情况下,您可能只是nesting another serializer更好,就像您已经为演出时间做的那样。

相关问题