免责声明:我正在学习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,其中代码是子元素。所以我得到一个例外,即未在想法中定义股票代码。很好 - 但我只是在猜测如何在这一点上设置它 - 我正在通过文档和源代码进行调整 - 但希望有人可以帮助我。
感谢你
答案 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'
)