2016-01-22 112 views
1

我有以下3个表Django的REST框架:管理关系

电影 ID | shortDesc |已上传

消息来源 ID |名称| createDate

movieSources movieID |的sourceID

如何链接它们放在一起,以让所有的数据在一个REST调用 我有下面的代码,它似乎没有工作

models.py

class movieSources(models.Model): 
     class Meta: 
       db_table = "movieSources" 
     movieID = models.IntegerField() 
     sourceID = models.IntegerField() 

class movies(models.Model): 
     class Meta: 
       db_table = 'movies' 
     uploaded = models.DateTimeField('date published') 
     sourcesMovie = models.OneToOneField(movieSources) 

class sources(models.Model): 
     class Meta: 
       db_table = 'sources' 
     createDate = models.DateTimeField('date published') 

Serializers.py

class MovieSourcesSerializer(serializers.ModelSerializer): 
     class Meta: 
      model = movieSources 

     fields = ('movieID', 'sourceID') 


class MoviesSerializer(serializers.ModelSerializer): 

    sourceID = serializers.IntegerField(source='sourcesMovie.sourceID') 

    class Meta: 
     model = movies 

    fields = ('id','uploaded', 'sourceID') 
+0

这两个模型'电影'和'源'指向表'电影'。这只是你的问题的一个错字,或者它也存在于你的原始代码中? – cezar

+0

抱歉错字纠正 – Vidya

回答

2

首先,您必须重新考虑模型的设计。如开篇所述,moviessources之间存在多对多关系。 movieSources应该是中间表,不需要声明为模型,因为Django的ORM注意到了这一点。

此外,我建议你遵循约定,并在PascalCase中编写你的模型类名称。为此使用相当单一的名称。

models.py

class Movie(models.Model): 
    short_desc = models.CharField('short description', max_length=255) 
    uploaded = models.DateTimeField('date published', auto_now=True) 

    class Meta: 
     db_table = 'movies' 


class Source(models.Model): 
    name = models.CharField(max_length=50) 
    create_date = models.DateTimeField('date published', auto_now=True) 
    movies = models.ManyToManyField(Movie, related_name='sources') 

    class Meta: 
     db_table = 'sources' 

所以应在机型外观根据您的描述等。选项auto_now=True将在创建条目时自动创建时间戳。模型以m:n关系连接。 Django照顾门后的一切。

现在你可以创建你的串行:

serializers.py

class MovieSerializer(serializers.ModelSerializer): 
    sources = serializers.PrimaryKeyRelatedField(many=True) 

    class Meta: 
     model = Movie 
     fields = (short_desc, uploaded, sources) 


class SourceSerializer(serializers.ModelSerializer): 
    movies = serializers.PrimaryKeyRelatedField(many=True) 

    class Meta: 
     model = Source 
     fields = (name, create_date, movies) 

PrimaryKeyRelatedField将获取的相关数据。

我没有测试代码,并记录下来,但我认为它应该是开箱即用的。我希望这个答案能帮助你,并给你一个想法,以更好地解决你的问题。