2013-10-11 36 views
4

聲明:我正在學習django,因爲我將它應用於我繼承的數據庫/ PHP應用程序。數據庫有點混亂,沒有外鍵約束和命名不一致。我不想在數據庫上觸摸或重做任何東西,因爲我根本不想與遺留應用程序進行溝通。Django Rest序列化程序:反向關係

堆棧:Python 2.7。 Django 1.5,Django Rest框架

問題是我有一個關係,那裏有一個有多個TICKER的想法。該行情表具有外鍵的想法(teaser_id),以便我們有類似

**Tickers** 
id teaser_id 
1 1 
2 1 
3 1 
4 2 
4 2 

**Ideas** 
id 
1 
2 

我Django的生成數據庫模型,但沒有FK約束它不能正常產生的所有關係。因此,這裏是山楂的機型配置:

class Tickers(models.Model): 
    id = models.IntegerField(primary_key=True) 

    # I changed to this 
    teaser_id = models.ForeignKey(Idea) 
    # From   
    # teaser_id = models.IntegerField(null=True, blank=True) 

    ticker = models.CharField(max_length=135L, blank=True) 
    date_added = models.CharField(max_length=135L, blank=True) 
    class Meta: 
     db_table = 'teaser_tickers' 


class Idea(models.Model): 
    id = models.IntegerField(primary_key=True) 
    industry_id = models.IntegerField() 
    post_type = models.CharField(max_length=45L) 

    class Meta: 
     db_table = 'idea' 

這裏是我的串行

class TickerSerializer(serializers.HyperlinkedModelSerializer): 

    class Meta: 
     model = myModels.Tickers 
     fields = (
      'id' 
      ,'teaser_id' 
      ,'ticker' 
     ) 

class IdeaSerializer(serializers.HyperlinkedModelSerializer): 
    user = UserSerializer(many=False, read_only=True) 
    ticker = TickerSerializer(many=True, read_only=True,) 
    teaser = myFields.TeaserField(teaser_length=200, original_field='content') 

    class Meta: 
     model = myModels.Idea 
     fields = (
      'id' 
      , 'title' 
      , 'date_added' 
      , 'user' 
      , 'teaser' 
      , 'ticker' 
     ) 

我想觀念的資源歸還代號爲子節點集。

REST請求適用於代碼是子元素的創意。所以我得到了一個例外,即股票在理念中沒有被定義。很好,但我只是在猜測如何設置這一點 - 我沉迷於文檔和源代碼 - 但希望有人能幫助我。

感謝您

回答

2

正如akaphenom說你必須使用related_name在你的序列化,但因爲你沒有在你的模型指定任何你必須使用默認的,在這情況teaser_set和你IdeaSerializer必須是:

class IdeaSerializer(serializers.HyperlinkedModelSerializer): 
    user = UserSerializer(many=False, read_only=True) 
    tickers = ReverseTickerSerializer(many=True, read_only=True) 
    teaser_set = myFields.TeaserField(teaser_length=200, original_field='content') 


class Meta: 
    model = myModels.Idea 
    fields = (
     'id', 
     'title', 
     'date_added', 
     'user', 
     'teaser_set', 
     'tickers', 
    ) 
+0

啊 - 我明白了。我已經死定了在Python中正確設置我的模型,並試圖重命名字段接近他們在域中。所以在我的情況下,我更喜歡我的解決方案 - 但我會將其標記爲正確,因爲它直接回答我的問題。感謝您的幫助。 – akaphenom

1

SO反向查找解決方案是正確,指定模式,即related_name這是在國外建立模型進行反向查找領域。現在我指定了一個自定義序列化程序來限制我感興趣的內容 - 但該程序是可選的。

class Tickers(models.Model): 
    id = models.IntegerField(primary_key=True) 

    # I changed to this 
    teaser_id = models.ForeignKey(Idea, related_name='tickers') 
    # From   
    # teaser_id = models.IntegerField(null=True, blank=True) 

    ticker = models.CharField(max_length=135L, blank=True) 
    date_added = models.CharField(max_length=135L, blank=True) 
    class Meta: 
     db_table = 'teaser_tickers' 


class Idea(models.Model): 
    id = models.IntegerField(primary_key=True) 
    industry_id = models.IntegerField() 
    post_type = models.CharField(max_length=45L) 

    class Meta: 
     db_table = 'idea' 

這裏是我的串行

class ReverseTickerSerializer(serializers.HyperlinkedModelSerializer): 

    class Meta: 
     model = myModels.Tickers 
     fields = (
      'id' 
      ,'ticker' 
     ) 

class IdeaSerializer(serializers.HyperlinkedModelSerializer): 
    user = UserSerializer(many=False, read_only=True) 
    tickers = ReverseTickerSerializer(many=True, read_only=True) 
    teaser = myFields.TeaserField(teaser_length=200, original_field='content') 

    class Meta: 
     model = myModels.Idea 
     fields = (
      'id' 
      , 'title' 
      , 'date_added' 
      , 'user' 
      , 'teaser' 
      , 'tickers' 
     ) 
相關問題