发布数据的同时创建相关Tastypie资源?(Posting data to create rela

2019-07-30 18:10发布

考虑到两个相关的Django模型AB一对多关系:

models.py

class A(models.Model):
  name = models.CharField(max_length=5)

class B(models.Model):
  name = models.CharField(max_length=5)
  a = models.ForeignKey(A)

并给予(可能非最佳)Tastypie资源:

api.py

class AResource(ModelResource):
    bs = fields.ToManyField( 'projectname.api.BResource', 'bs', full = True)
    class Meta:
        queryset = A.objects.all()

class BResource(ModelResource):
    a = fields.ToOneField( AResource, 'a', full = True)
    class Meta:
        queryset = B.objects.all()

让我们假设数据库是空为止。 现在,我有相关的外部数据,并希望观众数据库它用一个实例和B的几个实例

什么是解决这个问题的最漂亮的Tastypionic方式? 是否有可能人群A和BS在一次? 或者我需要的人群首先A,然后围观乙供应的ID作为ForeignKey的?

这将是巨大的,如果有人能想出一个例子后(例如使用Python字典和httplib2的,或卷曲)。

太感谢了。

Answer 1:

该解决方案是在这里。 对于tastypie领域,而在一次创建多个对象自动填充反向关系,使用相关的名称。 http://django-tastypie.readthedocs.org/en/v0.10.0/fields.html#tastypie.fields.RelatedField.related_name

RelatedField.related_name

用于帮助自动创建数据时填充反向关系。 默认为无。

为了使该选项正常工作,必须有对等的资源与此作为属性/实例名的字段。 通常这只是意味着增加反射ToOneField指回。

例:

class EntryResource(ModelResource):
    authors = fields.ToManyField('path.to.api.resources.AuthorResource', 'author_set', related_name='entry')

    class Meta:
        queryset = Entry.objects.all()
        resource_name = 'entry'

class AuthorResource(ModelResource):
    entry = fields.ToOneField(EntryResource, 'entry')

    class Meta:
        queryset = Author.objects.all()
        resource_name = 'author'

使用related_name做任务。 它映射相关领域的对象和创建数据时自动填充的关系。

像你一样full=True对你的资源的两侧就会产生最大递归深度超过了异常,因为这两种资源都充满在每个人。



Answer 2:

这里涉及的不是一对多关系多对多一个解决方案:

models.py

class B(models.Model):
    name = models.CharField(max_length=5)

class A(models.Model):
    name = models.CharField(max_length=5)
    bs = models.ManyToManyField(B)

api.py

class BResource(ModelResource):
    class Meta:
        queryset = B.objects.all()
        resource_name = 'b'

class AResource(ModelResource):
    bs = fields.ToManyField( BResource, 'bs', related_name = 'a', full = True, null=True)
    class Meta:
        queryset = A.objects.all()
        resource_name = 'a'

卷曲

curl -v -H "Content-Type: application/json" -X POST --data '{"name":"a_name1", "bs":[{"name":"b_name1"}, {"name": "b_name2"}]}' http:<my_path>/api/a/

httplib2.py

工作示例张贴经由使用httplib2的包一个Python脚本数据是基于张贴由沃伦-runk一个整洁和简单的解决方案 :

post_dict(
    url='http:<my_path>/api/a/',
    dictionary={
        'name' : 'a_name1',
        'bs' : [
            {'name' : 'b_name1'},
            {'name' : 'b_name1'},
        ]
    }
)

然而 ,现在一个额外的表为涉及A和在数据库中创建乙。 有可能是基于A和B的一对多关系,更好的解决方案?



文章来源: Posting data to create related Tastypie resources simultaneously?