Django - получить абсолютный URL при использовании .values ​​() - PullRequest
1 голос
/ 17 июня 2019

У меня есть пользовательская модель со многими полями

class User(AbstractBaseUser, PermissionsMixin):
    id = models.UUIDField(primary_key=True, default=uuid.uuid4, editable=False)
    email = models.EmailField(max_length=255, unique=True)
    username = models.SlugField(max_length=255, unique=True)
    first_name = models.CharField(max_length=255, blank=True, null=True)
    last_name = models.CharField(max_length=255, blank=True, null=True)
    avatar = models.ImageField(upload_to='users/avatar', default='users/avatar/avatar.png')
    last_login = models.DateTimeField(blank=True, null=True)
    member_since = models.DateTimeField(default=timezone.now, db_index=True)
    is_active = models.BooleanField(default=True)
    is_staff = models.BooleanField(default=False)
    is_superuser = models.BooleanField(default=False)

В конкретном представлении меня интересует получение только имени пользователя и аватара пользователя, чтобы я мог вернуть ответ JSON, поэтому я делаю следующее:

users = User.objects.values('username', 'avatar')

Это вернет мне список словарей со следующими данными:

<QuerySet [
    {'username': 'A', 'avatar': 'users/avatar/avatar.png'}, 
    {'username': 'B', 'avatar': 'users/avatar/avatar.png'}, 
    {'username': 'C', 'avatar': 'users/avatar/avatar.png'}
]>

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

Я бы хотел получить следующее:

<QuerySet [
    {'username': 'A', 'avatar': 'http://example.com/media/users/avatar/avatar.png'}, 
    {'username': 'B', 'avatar': 'http://example.com/media/users/avatar/avatar.png'}, 
    {'username': 'C', 'avatar': 'http://example.com/media/users/avatar/avatar.png'}
]>

1 Ответ

0 голосов
/ 17 июня 2019

На самом деле я столкнулся с той же проблемой неделю назад в Django, когда я получаю имя изображения от объекта, но я хочу получить доступ к URL-адресу изображения.

Итак, что я делал, я извлекал элемент следующим образом:

items = Item.objects.all()

for item in items:
    print({'item_name':item.name, 'item_url': item.image})

Таким образом, приведенный выше код дал мне имя элемента и имя изображения элемента вместо URL-адреса элемента, поэтому я прошел еще один шаг глубже и проверил атрибут item.image и получил URL-адрес из item.image.url

for item in items:
    print({'item_name':item.name, 'item_url': item.image.url})

так что в вашем случае вы можете сделать что-то вроде:

users = User.objects.values('username', 'avatar')
for user in users:
    print({'username': user.username, 'avatar': avatar.image.url})

если вы все еще не получаете URL своего изображения в avatar.image.url, просто попробуйте avatar.image. И проверьте все атрибуты в отладчике Python. Если у вас все еще есть какие-либо сомнения по этому поводу, вы можете задать их в комментарии.

...