4

免責事項:継承したデータベース/ PHPアプリに適用するため、djangoを学習しています。データベースは少しごちゃごちゃしており、外部キーの制約がなく、命名に一貫性がありません。レガシーアプリケーションをまったく使いたくないので、データベースに手を加えたりやり直したりしたくありません。

スタック: Python 2.7。Django 1.5、Django Rest フレームワーク

問題は、複数のティッカーを持つアイデアがある関係にあることです。ティッカー テーブルにはアイデア (teaser_id) への外部キーがあるため、次のようなものがあります。

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

**Ideas**
id
1
2

私はdjangoにデータベースからモデルを生成させましたが、FK Constraintsがなければ、すべての関係を適切に生成しませんでした. したがって、モデルが構成されているのは次のとおりです。

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 要求は、ティッカーが子要素であるアイデアに対するものです。そのため、ティッカーがアイデアで定義されていないという例外が発生しています。わかりました-しかし、私はこの時点でこれを設定する方法を推測しているだけです-ドキュメントとソースをスラッジしています-誰かが私を助けてくれることを望んでいました.

ありがとうございました

4

2 に答える 2

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',
    )
于 2013-10-11T23:17:39.477 に答える