ошибка присвоения иностранного ключа python django модель - PullRequest
0 голосов
/ 29 января 2020

models.py У меня есть внешний ключ в таблице платежей.Детали У меня есть полосовой метод оплаты, который работает, когда создается сеанс входа пользователя в систему, и используя значение сеанса, я получаю первичный ключ этого пользователя с помощью «ORM». метод, а затем назначить этот первичный ключ указанного пользователя c в поле моделей платежей по имени user_account_id, но я получаю ошибку, что не могу присвоить 1 для PaymentsDetail.User_account_id должен быть экземпляром UserAccountModel

class UserAccountModel(models.Model):

ContactEmail = models.EmailField(max_length=30)
FirstName = models.CharField(max_length=30)
LastName = models.CharField(max_length=40)
Counrty = models.CharField(max_length=50)
Phone = models.IntegerField()
ChooseUserName = models.CharField(max_length=30)
password = models.CharField(max_length=32)
EnterCaptcha = models.CharField(max_length=4)
payments = models.BooleanField(max_length=6, default=False)
showsponsor = models.CharField(max_length=30, default=False)
RegisteredDate = models.DateTimeField(auto_now_add=True, blank=True)
ActivationOn = models.DateField(auto_now_add=False,blank=True)
expiry_date = models.DateField(auto_now_add=False,blank=True)
def __str__(self):
    return self.FirstName + ":" + self.ChooseUserName



class PaymentsDetail(models.Model):

refrer_name = models.CharField(max_length=32,default="", editable=False)
sponser_name = models.CharField(max_length=32)
status = models.CharField(default='comped', max_length=32)
s_id = models.CharField(max_length=32)
registered = models.DateTimeField(auto_now_add=True)
activated_date = models.DateField(auto_now_add=False)
Due_Date = models.DateField(auto_now_add=False)
payment = models.CharField(default='$',max_length=32)
User_Account_id = models.ForeignKey(UserAccountModel, on_delete=models.CASCADE, default=True, editable=True)

addprogrameReference = models.ForeignKey(AddProgramModel, on_delete=models.CASCADE, default=True, editable=True)

class Meta:
    ordering = ['User_Account_id', 'addprogrameReference']

def str (self): вернуть self.refrer_name + ":" + self.user_account

Я получаю сообщение об ошибке

не может присвоить 1 для PaymentsDetail. User_account_id должен быть экземпляром UserAccountModel

views.py

                print("user payment"+str(charge.amount))
                pays = str(charge.amount)
                user_id = random.randint(0, 999)  # returns a random integer
                user = User.objects.get(username=str(rerredby))
                userKey = user.pk
                print("this one is for user upper")
                # saving record
                payment_insertion = PaymentsDetail.objects.create(
                    User_Account_id=userKey,
                    refrer_name=rerredby,
                    sponser_name=rerredby,
                    s_id=str(user_id),
                    registered=datetime.now(),
                    activated_date=datetime.now(),
                    Due_Date=datetime.now(),
                    payment=str(pays + "$"),
                )
                payment_insertion.save()

Ответы [ 2 ]

0 голосов
/ 29 января 2020

Ваша реализация представления не верна. Класс модели ожидает, что поле User_Account_id будет экземпляром UserAccountModel (поскольку определение вашей модели User_Account_id = models.ForeignKey(UserAccountModel, on_delete=models.CASCADE, default=True, editable=True) указало, что оно должно ожидать его независимо от того, имя вашего поля заканчивается идентификатором). поэтому сначала извлеките экземпляр UserAccountModel из базы данных.

Однако, если вы все же хотите передать идентификатор вместо объекта, измените следующее в своем представлении.

User_Account_id_id=userKey

Поля ForeingKey могут быть заполнены идентификатором вместо соответствующего объекта модели. Но вы должны добавить _id в конце имени поля, например,

#models.py

class Author(models.Model):
   name = models.CharField(max_length=250)


class Book(models.Model):
   name = models.CharField(max_length=250)
   author = models.ForeignKeyField(Author, on_delete=models.CASCADE)


# views.py

def create_book(request):
   name = request.POST.get('name', '')
   author_id = request.POST.get('author_id', '')

   Book.objects.create(name=name, author_id=author_id)

   return HttpResponse(status=201)

Обратите внимание, что в модели Book не определено поле author_id. Это поле неявно определяется с помощью django ORM после того, как вы определили поле author как ссылку ForeignKey на модель Author.

0 голосов
/ 29 января 2020

Просто измените эту строку:

payment_insertion = PaymentsDetail.objects.create(
                User_Account_id=user,
                ...)

Вы пытаетесь назначить объект int, где Django ожидает экземпляр.

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