Я определил отношения OneToOne в модели b с помощью модели a. Когда я пытаюсь сохранить модель b, я получаю ошибку «Модель B: объект не имеет атрибута id». Как решить эту проблему? Что мне здесь не хватает.
Модели:
class ModelA:
invoicedate = models.DateTimeField(blank=True)
amount = models.DecimalField(max_digits=12, decimal_places=2)
status = models.CharField(max_length=20, default='ACTIVE')
class Meta:
db_table = "modela"
class ModelB:
rel = models.OneToOneField(ModelA, on_delete=models.CASCADE, primary_key=True)
field1 ...
class Meta:
db_table = "modelb"
Метод вставки данных в модели:
@transaction.atomic
def methodToInsertData(args):
new_modela = ModelA(
"invoicedate" = "2018-11-05",
"amount" = 5000,
"status" = "ACTIVE"
)
new_modela.save()
new_modelb = ModelB(
rel = new_modela,
...
)
new_modelb.save() #This statement throws "object has no attribute id" error
ModelA автоматически создаст id в качестве первичного ключа, но модель B не будет иметь id в качестве первичного ключа, вместо этого поле rel будет первичным ключом с отношением OneToOne к модели A.
Мы будем очень признательны за любые предложения по решению этой проблемы.
Это была просто ссылка на поле даты. Я отредактировал его на InvoiceDate.





Возможно, вы установили OneToOneField в качестве первичного ключа модели. Попробуйте удалить primary_key = True и либо явно установить другое поле (uuid или целое число) как pk, либо просто разрешите модели установить свой собственный идентификатор.
rel = models.OneToOneField(ModelA, on_delete=models.CASCADE)
Модель rel rel является расширением модели A, и ключ rel должен быть первичным ключом.
в соответствии с вашим кодом вы не сможете сохранить ModelA, вы должны были столкнуться с ошибкой
SyntaxError: keyword can't be an expression