#django #django-models #django-rest-framework #django-views
#django #django-модели #django-rest-framework #django-просмотры
Вопрос:
Я предполагаю, что уже было много доступных обсуждений, почти прошли через все из них, но все еще сталкивались с этой ошибкой.
class Device(models.Model):
"""Storing Device ids """
platform = models.CharField(max_length=3, choices=PLATFORM, default = 'ANR')
dev_id = models.CharField(max_length = 255, null=True, blank=False)
def __str__(self):
return str(self.id)
class UserProfile(models.Model):
user = models.OneToOneField('user.User',
on_delete=models.CASCADE,
related_name='profile',
primary_key=True,
unique=True)
device = models.ManyToManyField(Device, related_name='devices')
def __str__(self):
return str(self.user)
Ошибка 1
username = UserProfile.objects.filter(
phone_number=user_username).get()
username.device.dev_id
*** AttributeError: 'ManyRelatedManager' object has no attribute 'dev_id'
Ошибка 2
После некоторого исследования
username.device.values_list('dev_id', flat=True)
<QuerySet []>
```
There is no device found with this user but there are devices in them for this username
For the reference, I have listed devices
```python
>>> Device.objects.all()
<QuerySet [<Device: 1>]>
Ошибка 3
(Pdb) username.device.all()
<QuerySet []>
Checked with this Method but not able to list devices
Ответ №1:
Это не может работать, потому device
что это ManyToMany
связь. Очевидно, что у пользователя может быть связано несколько устройств (или ни одного).
Если вы хотите получить доступ ко всем устройствам от пользователя, попробуйте следующее:
user.device.all()
это даст вам a QuerySet
из a RelatedManager
. Просто используйте его как обычный QuerySet
:
for d in user.device.all():
print(d.dev_id)
Это, конечно, описано в документации.
Комментарии:
1. На самом деле, вы были правы
no device at all associated with the user
, я пропустил то, что я создал объекты самостоятельно, но не добавилdevice
вuserProfile
Спасибо за объяснение и документацию по ссылкам.