Django Rest Serializer:反向关系

时间:2013-10-11 20:02:55

标签: django rest django-rest-framework

免责声明:我正在学习django,因为我将它应用于我继承的数据库/ PHP应用程序。数据库有点混乱,没有外键约束,命名也不一致。我不想触摸或重做数据库上的任何内容,因为我根本不想使用遗留应用程序。

Stack:Python 2.7。 Django 1.5,Django Rest Framework

问题在于我有一个关系,其中有一个包含多个代码的Idea。代码表有想法的外键(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'
        )

我希望Ideas Resource将代码作为子节点集返回。

REST请求用于Idea,其中代码是子元素。所以我得到一个例外,即未在想法中定义股票代码。很好 - 但我只是在猜测如何在这一点上设置它 - 我正在通过文档和源代码进行调整 - 但希望有人可以帮助我。

感谢你

2 个答案:

答案 0 :(得分:2)

由于akaphenom说您必须在序列化程序中使用related_name,但由于您未在模型中指定任何名称,因此您必须使用默认值,在本例中为 teaser_set 和您的{{1}必须是:

IdeaSerializer

答案 1 :(得分:1)

反向查找的解决方案是正确指定模型,即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'
        )