Ошибка Django ManyToManyFields `Ошибка атрибута: объект ‘ManyRelatedManager’ не имеет атрибута ‘dev_id»

#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 Спасибо за объяснение и документацию по ссылкам.