Tastypie отправляет POST для обновления внешнего ключа - PullRequest
0 голосов
/ 22 мая 2018

Я недавно начал работать с Django (и вообще с python!) И хотел использовать Tastypie для автоматизации дополнений в моей базе данных.

Для моей текущей проблемы у меня есть две таблицы в моей базе данных, одна из которых отображает название компании и идентификатор компании, а другая содержит всю информацию о лицензионном ключе, как показано ниже:

models.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

Затем я определил все элементы API здесь:

resources.py

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 request, я получаю

"error_message": "Не выполнено ограничение NOT NULL: licence_licence.company_id_id"

Я понимаю, что не отправил это значение вместе сPOST-запрос, но я предположил, что _id был идентификатором этой записи базы данных, которой обычно автоматически управляет Django.

Есть ли способ, которым Django может управлять этим, если он пропущен, или есть более разумный способ форматирования запроса POST?

Большое спасибо за ваше время!Это мой первый пост на SO, поэтому, если я что-то пропустил, пожалуйста, дайте мне знать:)

...