2016-01-22 118 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將獲取的相關數據。

我沒有測試代碼,並記錄下來,但我認爲它應該是開箱即用的。我希望這個答案能幫助你,並給你一個想法,以更好地解決你的問題。