Сбой Django при сохранении сериализатора со ссылками на внешний ключ - PullRequest
0 голосов
/ 16 января 2019

Итак, у меня была модель с одним внешним ключом, которая работала очень хорошо в течение нескольких недель.В итоге мне пришлось добавить еще одну ссылку на внешний ключ в модель, и теперь я не могу сохранять записи с помощью сериализатора.Я должен отметить, что я использую Django 2.1.Вот модель, которую я использую (некоторые поля удалены для простоты):

class Finding(models.Model):
    finding_id = models.IntegerField(null=False, blank=False, primary_key=True, db_index=True)
    name = models.CharField(null=True, blank=True, max_length=255)
    web_app = models.ForeignKey(WebApplication, on_delete=models.CASCADE)
    q_id = models.ForeignKey(StagingQkb, on_delete=models.CASCADE)

Новый FK - это поле q_id.Это было просто обычное инт раньше.Я на самом деле уничтожил старую таблицу, а новая все еще совершенно пуста, поэтому я знаю, что это не проблема с существующими данными (таблицы с внешними ключами все еще не повреждены).При сохранении результатов раньше я просто предоставлял PK объекта WebApplication для «web_app».Насколько я могу сказать, это все еще работает.Поле 'q_id', когда оно вставляется таким же образом, жалуется, что ему нужен int / string / bytes вместо объекта StagingQkb.Ну, я не даю ему объект StagingQkb, так что же дает!

Вот сериализатор:

class FindingSerializer(serializers.ModelSerializer):

    class Meta:
        model = Finding
        fields = '__all__'

Данные, которые я передаю в сериализатор, выглядят так:

data = {'finding_id': 5514989,
        'name': 'Sample-Name',
        'q_id': 12345,
        'web_app': 67890}

Когда я вставляю данные в сериализатор, я делаю следующее:

>>> fs = FindingSerializer(data=data)
>>> fs.is_valid()
True
>>> fs.save()

Ошибка, которую я получаю после запуска вышеуказанного кода, выглядит следующим образом:

Traceback (most recent call last):
  File "<input>", line 1, in <module>
  File "/opt/oss/python35/lib/python3.5/site-packages/rest_framework/serializers.py", line 214, in save
    self.instance = self.create(validated_data)
  File "/opt/oss/python35/lib/python3.5/site-packages/rest_framework/serializers.py", line 959, in create
    raise TypeError(msg)
TypeError: Got a `TypeError` when calling `Finding.objects.create()`. This may be because you have a writable field on the serializer class that is not a valid argument to `Finding.objects.create()`. You may need to make the field read-only, or override the FindingSerializer.create() method to handle this correctly.
Original exception was:
 Traceback (most recent call last):
  File "/opt/oss/python35/lib/python3.5/site-packages/rest_framework/serializers.py", line 940, in create
    instance = ModelClass._default_manager.create(**validated_data)
  File "/opt/oss/python35/lib/python3.5/site-packages/django/db/models/manager.py", line 82, in manager_method
    return getattr(self.get_queryset(), name)(*args, **kwargs)
  File "/opt/oss/python35/lib/python3.5/site-packages/django/db/models/query.py", line 413, in create
    obj.save(force_insert=True, using=self.db)
  File "/home/dpz3w0q/AutonomousPrimeD/autonomousprimed/Finding/models.py", line 83, in save
    q_id=self.q_id)
  File "/home/dpz3w0q/AutonomousPrimeD/autonomousprimed/Finding/models.py", line 173, in evaluate
    if ScoreMatrix.objects.filter(q_id=q_id).count() > 0:
  File "/opt/oss/python35/lib/python3.5/site-packages/django/db/models/manager.py", line 82, in manager_method
    return getattr(self.get_queryset(), name)(*args, **kwargs)
  File "/opt/oss/python35/lib/python3.5/site-packages/django/db/models/query.py", line 844, in filter
    return self._filter_or_exclude(False, *args, **kwargs)
  File "/opt/oss/python35/lib/python3.5/site-packages/django/db/models/query.py", line 862, in _filter_or_exclude
    clone.query.add_q(Q(*args, **kwargs))
  File "/opt/oss/python35/lib/python3.5/site-packages/django/db/models/sql/query.py", line 1263, in add_q
    clause, _ = self._add_q(q_object, self.used_aliases)
  File "/opt/oss/python35/lib/python3.5/site-packages/django/db/models/sql/query.py", line 1287, in _add_q
    split_subq=split_subq,
  File "/opt/oss/python35/lib/python3.5/site-packages/django/db/models/sql/query.py", line 1225, in build_filter
    condition = self.build_lookup(lookups, col, value)
  File "/opt/oss/python35/lib/python3.5/site-packages/django/db/models/sql/query.py", line 1096, in build_lookup
    lookup = lookup_class(lhs, rhs)
  File "/opt/oss/python35/lib/python3.5/site-packages/django/db/models/lookups.py", line 20, in __init__
    self.rhs = self.get_prep_lookup()
  File "/opt/oss/python35/lib/python3.5/site-packages/django/db/models/lookups.py", line 70, in get_prep_lookup
    return self.lhs.output_field.get_prep_value(self.rhs)
  File "/opt/oss/python35/lib/python3.5/site-packages/django/db/models/fields/__init__.py", line 1807, in get_prep_value
    return int(value)
TypeError: int() argument must be a string, a bytes-like object or a number, not 'StagingQkb'

Я застрял здесь.Я не изменил способ передачи данных в сериализатор, поэтому я действительно не могу сказать, что я сделал неправильно.Если кто-нибудь сможет помочь мне разобраться с этим, я буду очень признателен!

1 Ответ

0 голосов
/ 16 января 2019

Благодаря @WillKeeling я понял, что у меня есть ссылка на Finding.q_id в моем методе save (), который я забыл обновить после внесения изменений в FK. PK внешней таблицы - qkb_id, поэтому я изменил ссылку на Finding.q_id.qkb_id и смог сохранить модель.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...