Python Tastypie发送POST以更新外键

Python Tastypie发送POST以更新外键,python,django,post,tastypie,Python,Django,Post,Tastypie,我最近开始使用Django(通常是python!),我希望使用Tastypie来自动添加到我的数据库中 对于我当前的问题,我的数据库中有两个表,一个显示公司名称和公司ID,另一个保存所有许可证密钥信息,如下所示: 型号.py class Company(models.Model): company_name = models.CharField(max_length=200, verbose_name= "Company Name") company_id = models.Ch

我最近开始使用Django(通常是python!),我希望使用Tastypie来自动添加到我的数据库中

对于我当前的问题,我的数据库中有两个表,一个显示公司名称和公司ID,另一个保存所有许可证密钥信息,如下所示:

型号.py

class Company(models.Model):
    company_name = models.CharField(max_length=200, verbose_name= "Company Name")
    company_id = models.CharField(max_length=15, verbose_name= "Company ID")

    def __str__(self):
        return self.company_name


class Licence(models.Model):
    company_id = models.ForeignKey(Company, on_delete=models.CASCADE, verbose_name= "Company ID")
    licence_key = models.CharField(max_length=100, verbose_name= "Licence Key")
    lpars = models.CharField(max_length=100, default = "", verbose_name= "List of Systems")
    rss = models.BooleanField(default = None, verbose_name= "RSS")
    gui = models.BooleanField(default = None, verbose_name= "RACFGui")
    exr = models.BooleanField(default = None, verbose_name= "Exception Reporter")
    zdt = models.BooleanField(default = None, verbose_name= "zDetect")
    bg = models.BooleanField(default = None, verbose_name= "BreakGlass")
    sspr = models.BooleanField(default = None, verbose_name= "Self Service Password Reset")
    rss_custom = models.BooleanField(default = None, verbose_name= "RSS Custom")
    expiry = models.DateField(auto_now=False, auto_now_add=False)
    trial = models.BooleanField(default = False, verbose_name= "Trial?")

    def __str__(self):
        return self.licence_key
class CompanyResource(ModelResource):
    class Meta:
        queryset = Company.objects.all()
        resource_name = 'company'

class LicenceResource(ModelResource):

    class Meta:
        queryset = Licence.objects.all()
        include_resource_uri = True
        resource_name = 'licence'
        authorization = Authorization()
    def dehydrate(self, bundle):
        bundle.data['company'] = bundle.obj.company_id
        return bundle
然后我在这里定义了所有api内容:

resources.py

class Company(models.Model):
    company_name = models.CharField(max_length=200, verbose_name= "Company Name")
    company_id = models.CharField(max_length=15, verbose_name= "Company ID")

    def __str__(self):
        return self.company_name


class Licence(models.Model):
    company_id = models.ForeignKey(Company, on_delete=models.CASCADE, verbose_name= "Company ID")
    licence_key = models.CharField(max_length=100, verbose_name= "Licence Key")
    lpars = models.CharField(max_length=100, default = "", verbose_name= "List of Systems")
    rss = models.BooleanField(default = None, verbose_name= "RSS")
    gui = models.BooleanField(default = None, verbose_name= "RACFGui")
    exr = models.BooleanField(default = None, verbose_name= "Exception Reporter")
    zdt = models.BooleanField(default = None, verbose_name= "zDetect")
    bg = models.BooleanField(default = None, verbose_name= "BreakGlass")
    sspr = models.BooleanField(default = None, verbose_name= "Self Service Password Reset")
    rss_custom = models.BooleanField(default = None, verbose_name= "RSS Custom")
    expiry = models.DateField(auto_now=False, auto_now_add=False)
    trial = models.BooleanField(default = False, verbose_name= "Trial?")

    def __str__(self):
        return self.licence_key
class CompanyResource(ModelResource):
    class Meta:
        queryset = Company.objects.all()
        resource_name = 'company'

class LicenceResource(ModelResource):

    class Meta:
        queryset = Licence.objects.all()
        include_resource_uri = True
        resource_name = 'licence'
        authorization = Authorization()
    def dehydrate(self, bundle):
        bundle.data['company'] = bundle.obj.company_id
        return bundle
这在我发出GET请求时非常有效,并显示以下信息:

{
"bg": false,
"company": "xxxx", (blanked out for security)
"expiry": "2018-05-11",
"exr": true,
"gui": false,
"id": 13,
"licence_key": "xxxxx-xxxxx-xxxxx",
"lpars": "xxxx xxxx",
"resource_uri": "/api/licence/13/",
"rss": true,
"rss_custom": true,
"sspr": false,
"trial": false,
"zdt": true
}

然而,当我尝试用
POST请求复制此内容时,我得到

“错误\u消息”:“非空约束失败:许可证\u许可证。公司\u id\u id”

我知道我没有在POST请求中提交此值,但我假设
\u id
是数据库条目的id,它通常由Django自动管理

如果省略,有没有办法让Django来管理它,或者有没有更聪明的方法来格式化POST请求


非常感谢您的时间!这是我在SO上的第一篇帖子,如果我遗漏了什么,请告诉我:)

我不知道Tastypie(Django Rest框架是这类事情的常用工具),但在我看来,您定义了一个
deterheate
方法来指定公司字段的输出方式,也许你需要一个
hydrome
方法来指定相反的方向?确实,请参阅上的文档。@DanielRoseman非常感谢!我必须退房——同时感谢您的指导:)