Почему я получаю ошибку идентификатора дубликата ключа пользователя, даже если в моей модели первичный ключ не указан? - PullRequest
0 голосов
/ 28 июня 2019

У меня есть модель Interactions, которая наследуется от предопределенной пользовательской модели django, но у меня есть messageId, чтобы быть первичным ключом.

models.py:

class Interaction(models.Model):
messageId = models.TextField(max_length=5000,primary_key=True, unique = True)
user = models.OneToOneField(User, primary_key = False, on_delete=models.CASCADE)
reciever = models.TextField(max_length=5000,blank=True,default='')
sender = models.TextField(max_length=5000,blank=True,default='')
date = models.TextField(max_length=5000,blank=True,default='')
subject = models.TextField(max_length=5000,blank=True,default='')
label = models.TextField(max_length=5000,blank=True,default='')

У меня есть словарь данных, в котором хранится необходимая информация. В views.py

entry, created = Interaction.objects.get_or_create(messageId=data['id'])
entry.user = request.user
entry.sender = data['from']
entry.reciever = data['to']
entry.date = data['date']
entry.subject = data['subject']
entry.label = data['label']
entry.save()

Таким образом, при выполнении кода появляются сообщения с одним и тем же пользователем, но, очевидно, с разными идентификаторами сообщений

пользователь не мой первичный ключ, но я получаю сообщение об ошибке djongo.sql2mongo.SQLDecodeError: FAILED SQL: UPDATE "mainapp_interaction" SET "user_id" = %(0)s, "reciever" = %(1)s, "sender" = %(2)s, "date" = %(3)s, "subject" = %(4)s, "label" = %(5)s WHERE "mainapp_interaction"."messageId" = %(6)s Pymongo error: {'index': 0, 'code': 11000, 'errmsg': 'E11000 duplicate key error collection: 5d02255b9ccf640b8c608ee1_mysitev6.mainapp_interaction index: user_id_1 dup key: { : 16 }'}

1 Ответ

0 голосов
/ 28 июня 2019

Не имеет значения, что это не первичный ключ.Это OneToOneField, поэтому в базе данных может быть не более одной записи на пользователя.Логически я считаю, что это должен быть ForeignKey, а вам не нужен флаг primary_key=False.

Кроме того, я рекомендую использовать models.DateTimeField() для хранения дат (я не знаю точного использованиявашей модели, но если поля такие, как они говорят, вы должны учитывать это).

Удачи!

...