【问题标题】:Django Rest Serializer: Reverse relationshipsDjango Rest Serializer:反向关系
【发布时间】:2013-10-20 00:24:36
【问题描述】:

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

堆栈: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 约束,它无法正确生成所有关系。所以这里是模型的配置:

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 请求是针对代码是子元素的创意。所以我得到了一个例外,即在想法中没有定义ticker。很好 - 但我只是在猜测如何设置它 - 我正在浏览文档和源 - 但希望有人能帮助我。

谢谢

【问题讨论】:

    标签: django rest django-rest-framework


    【解决方案1】:

    正如 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',
        )
    

    【讨论】:

    • 啊 - 我明白了。我对在 Python 中正确设置我的模型并尝试将字段重命名为接近它们在域中的名称已经下定决心。所以就我而言,我更喜欢我的解决方案——但我会将其标记为正确,因为它直接回答了我的问题。感谢您的帮助。
    【解决方案2】:

    所以反向查找的解决方案是正确指定模型,即相关名称,它是在外部模型中创建的用于执行反向查找的字段。现在我指定了一个自定义序列化程序来限制我感兴趣的内容 - 但那部分是可选的。

    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'
            )
    

    【讨论】:

      猜你喜欢
      • 2021-11-16
      • 2012-12-25
      • 2021-05-29
      • 1970-01-01
      • 2014-05-27
      • 2017-02-21
      • 2018-08-04
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多