Есть ли способ сделать таблицу 'One' необязательной в OneToManyRelationship в Django

У меня есть две таблицы, одна - Anonym, другая - Userdatabase. Я хочу, чтобы мое приложение работало, не требуя никакой информации для входа, поэтому оно будет работать только с Anonym, используя deviceid пользователя для обработки информации об учетной записи. Однако, если пользователь хочет получить доступ к дополнительным функциям, ему необходимо создать пользователя с именем пользователя/паролем. Затем я буду обрабатывать данные с помощью таблицы Userdatabase. У пользователя может быть несколько устройств, поэтому существует связь OneToMany, но устройство не обязательно должно иметь пользователя (ему не нужно регистрироваться), что нарушает связь. Есть ли способ сделать таблицу Userdatabase необязательной, сохранив при этом отношение OneToMany? Возможно, путем вставки метода или другого класса в UserDatabase? Ниже приведен код:

--Модели--

class Anonym(models.Model):
    deviceid=models.ForeignKey(Userdatabase,max_length=200,on_delete=models.SET_NULL,null=True)
    accounttype=models.TextField(default='Free')
    numberofattempts=models.IntegerField(default=0)
    created=models.DateField(auto_now_add=True)

class Userdatabase(models.Model):
    username=models.CharField(max_length=20,unique=True)
    password=models.CharField(max_length=20)
    deviceid=models.TextField(default='inputdeviceid')
    accounttype=models.TextField(default='Free')
    numberofattempts=models.IntegerField(default=0)
    created=models.DateField(auto_now_add=True)

--урлы--

urlpatterns=[path('deviceregister/<str:id>/',views.deviceregistration)]

--просмотры--

def deviceregistration(request,id):
    import time

    deviceid=id
    newdevice-models.Anonym(created=time.strftime("%Y-%m-%d"),deviceid=deviceid)
    newdevice.save()

    return HttpResponse('Succesful registration')

Когда я отправляю запрос, например, как '/deviceregister/123456/', django выдает ValueError, говоря, что Cannot assign "'123456'": "Anonym.deviceid" должен быть экземпляром "Userdatabase".

вы должны искать по имени поля, которое содержит id. в вашем случае это deviceid_id.

newdevice=models.Anonym(created=time.strftime("%Y-%m-%d"),deviceid_id=deviceid)

deviceid в вашем случае должно быть Userdatabase.objects.get(pk=id)

deviceid=Userdatabase.objects.get(pk=id)
newdevice=models.Anonym(created=time.strftime("%Y-%m-%d"),deviceid=deviceid)

на мой взгляд - названия полей в вашем проекте действительно могут запутать кого угодно

Если вы не хотите менять модель, вы можете просто связать любое вновь добавляемое устройство с пользователем dummy. Когда позже пользователь захочет связать устройство, замените dummy на настоящего пользователя.

Если вы можете изменить вашу модель, вы можете удалить отношение внешнего ключа, и добавить другую таблицу, которая связывает id обеих сторон: одно поле для deviceid и другое userid.

Я знаю, что оба варианта пахнут, но, по крайней мере, они должны работать :)

Вернуться на верх