Присвойте значение полю «один ко многим» через код django - PullRequest
1 голос
/ 10 октября 2019

Я пытаюсь присвоить значение записи базы данных, определенной с помощью models.ForeignKey. Как мне ссылаться на переменные в указанной модели?

В приведенном ниже коде назначение update_user.appointments.requester_name = requesting_user не работает. Поиск в Google не помог мне найти правильное решение. Как следует ссылаться на такие переменные из django / python?

Ниже приводится мой models.py

class AppointmentRequest(models.Model):
    my_name = models.TextField(default='')
    requester_name = models.TextField(default='')
    meeting_year = models.TextField(default='')


class CustomUser(AbstractUser):
    firstname = models.TextField(default='')
    lastname = models.TextField(default='')
    appointments = models.ForeignKey(AppointmentRequest, on_delete=models.CASCADE, default='', blank=True, null=True)

Я хочу изменить значение записи о встречах, то есть my_name, requestter_name и т. Д. .

Ниже приведен код в views.py

def book_appointment(request):
    requesting_user = request.GET['requesting_user']
    update_user = CustomUser.objects.get(username=requested_user)
    update_user.appointments.requester_name = requesting_user

Ответы [ 2 ]

1 голос
/ 10 октября 2019

Причина, по которой вы, вероятно, получаете объект "NoneType" не имеет атрибута "requestter_name", заключается в том, что update_user.appointments, вероятно, имеют значение null

appointments = models.ForeignKey(AppointmentRequest, on_delete=models.CASCADE, default='', blank=True, null=True)

Это говорит о том, что ваш ForeignKey может быть нулевым, так что этовероятно, возвращается к вам.

То, что вы действительно должны сделать, это:

if update_user.appointments:
    update_user.appointments.requester_name  = request.GET['requesting_user']
else:
    apt_request = AppointmentRequest()
    apt_request.requester_name = request.GET['requesting_user']
    apt_request.save()
    update_user.appointments = apt_request()

update_user.save()

Это создает объект AppointmentRequest, который вы используете для установки назначений ForeignKey IF update_user.appointments имеет значение null.

ТАКЖЕ, в этом коде:

appointments = models.ForeignKey(AppointmentRequest, on_delete=models.CASCADE, default='', blank=True, null=True)

Я почти уверен, что default = '' ничего не делает и по умолчанию имеет значение null. Таким образом, вы можете опустить эту часть кода.

Продолжение в комментариях ...: Ох. Еще одна вещь. Я бы не использовал ForeignKeys для этого. Я бы использовал ManyToMany, если только пользователю не разрешено только ОДИН прием.

0 голосов
/ 10 октября 2019
    requesting_user = request.GET['requesting_user']

в этой части вы получаете пользователя как json, а не экземпляр модели django, поэтому при применении

    update_user = CustomUser.objects.get(username=requested_user)

он ничего не получает.

выследует использовать django serializer для создания userSerializer, а затем использовать его для преобразования пользователя json в экземпляр модели, а затем при применении

    update_user = CustomUser.objects.get(username=requested_user)

это должно работать.

...