I'm developing a REST API using Django Rest Framework but I'm unable to populate image in Feed Serializer
Django Version: 3.1.7
Python Version: 3.9.2
Models:
class User(AbstractUser):
age = models.PositiveIntegerField(null=True)
address = models.TextField(null=True)
email = models.EmailField(_('email address'), unique=True, null=False)
first_name = models.CharField(_('first name'), max_length=150, blank=False, null=False)
last_name = models.CharField(_('last name'), max_length=150, blank=False, null=False)
image = models.ImageField(upload_to='storage', null=True)
class Feed(models.Model):
description = models.TextField()
likes_count = models.PositiveIntegerField(default=0, null=True)
comments_count = models.PositiveIntegerField(default=0, null=True)
updated_at = models.DateTimeField(auto_now=True)
created_at = models.DateTimeField(auto_now_add=True)
user = models.ForeignKey(User, on_delete=models.CASCADE, related_name='user')
tags = models.ManyToManyField(User, related_name='tags', blank=True)
class FeedImage(models.Model):
path = models.ImageField(upload_to='storage', null=False)
post = models.ForeignKey(Feed, on_delete=models.CASCADE, null=False, default='')
Serializers:
class FeedUserSerializer(ModelSerializer):
class Meta:
model = User
fields = ('id', 'first_name', 'last_name', 'image')
class FeedImageSerializer(serializers.ModelSerializer):
class Meta:
model = FeedImage
fields = ('id', 'path', 'post')
class FeedSerializer(ModelSerializer):
user = FeedUserSerializer()
images = FeedImageSerializer(many=True, read_only=True)
class Meta:
model = Feed
fields = ('id', 'description', 'comments_count', 'likes_count', 'updated_at', 'created_at',
'tags', 'images', 'user')
View:
class FeedsListView(generics.ListAPIView):
queryset = Feed.objects.all()
return FeedSerializer
Problem: I get this result without images
[{
"id": 1,
"description": "Hello world",
"comments_count": 0,
"likes_count": 0,
"updated_at": "2021-04-26T03:01:44.219235Z",
"created_at": "2021-04-26T03:01:44.219235Z",
"tags": [],
"user": {
"id": 1,
"first_name": "ZAIN",
"last_name": "REHMAN",
"image": "http://192.168.88.28:8000/storage/1_Facebook_1.jpg"
}
}]
Expected Output:
[{
"id": 1,
"description": "Hello world",
"comments_count": 0,
"likes_count": 0,
"updated_at": "2021-04-26T03:01:44.219235Z",
"created_at": "2021-04-26T03:01:44.219235Z",
"tags": [],
"user": {
"id": 1,
"first_name": "abc_first",
"last_name": "cdef_last",
"image": "http://192.168.88.28:8000/storage/1_Facebook_1.jpg"
},
"images": [
{
"id": 1,
"post": "1",
"path": "imagelocation"
},
{
"id": 2,
"post": "1",
"path": "imagelocation 2"
}
]
}]
Any solution or any workaround will be appreciated.
Ignore this: Bulk text to resolve StackOverflow problem
industry. Lorem Ipsum has been the industry's standard dummy text ever since the 1500s, when an unknown printer took a galley of type and scrambled it to make a type specimen book.
You can use SerializerMethodField for this.
class FeedSerializer(ModelSerializer):
images = serializers.SerializerMethodField()
class Meta:
model = Feed
fields = ('id', 'description', 'comments_count', 'likes_count', 'updated_at', 'created_at',
'tags', 'images', 'user')
def get_images(self, obj):
return obj.feedimage_set.all().values('id', 'path', 'post')
Related
I am new to the Django Rest Framework. I am attempting to get the navSidebarMaps object to serialize as follows:
[
"navSidebarName": "mainSidebar",
[
{
"id": 1,
"name": "item1",
"order": 1,
},
{
"id": 2,
"name": "item2",
"order": 2,
}
]
]
What is the recommended approach for pulling the list of navSidebarItems through to the navSidebarMaps? The related_name argument seems to get me part way to the goal. However, I've missed something.
Models:
class navSidebars(models.Model):
name = models.CharField(max_length=50, blank=False, null=False)
description = models.CharField(max_length=150, blank=False, null=False)
class navSidebarItems(models.Model):
name = models.CharField(max_length=50, blank=False, null=False)
description = models.CharField(max_length=150, blank=False, null=False)
class navSidebarMaps(models.Model):
fk_navsidebar = models.ForeignKey('core.navSidebars', related_name='sidebars', on_delete=models.CASCADE)
fk_navsidebar_items = models.ForeignKey('core.navSidebarItems', related_name='sidebar_items', on_delete=models.CASCADE)
order = models.IntegerField(default=0, blank=False, null=False)
Serializers:
class navSidebarSerializer(serializers.ModelSerializer):
created_by = serializers.ReadOnlyField(source='created_by.username')
modified_by = serializers.ReadOnlyField(source='modified_by.username')
class Meta:
model = navSidebars
fields = [
'id',
'name',
'description',
'active',
'visible',
'enabled',
'can_delete',
'fk_navsidebar',
'created_by',
'created_when',
'modified_by',
'modified_when'
]
class navSidebarItemsSerializer(serializers.ModelSerializer):
created_by = serializers.ReadOnlyField(source='created_by.username')
modified_by = serializers.ReadOnlyField(source='modified_by.username')
class Meta:
model = navSidebarItems
fields = [
'id',
'name',
'description',
'position',
'active',
'visible',
'enabled',
'can_delete',
'created_by',
'created_when',
'modified_by',
'modified_when'
]
class navSidebarMapsSerializer(serializers.ModelSerializer):
created_by = serializers.ReadOnlyField(source='created_by.username')
modified_by = serializers.ReadOnlyField(source='modified_by.username')
class Meta:
model = navSidebarMaps
fields = [
'id',
'fk_navsidebar',
'fk_navsidebar_items',
'created_by',
'created_when',
'modified_by',
'modified_when'
]
I am trying to get all the bills and their customer-related details (i.e. 'customer_code', 'email' etc.) with it.
However, source='user.customer_code does not seem to have any effect at all. What am I missing?
I have been following along this:
this stackoverflow post with no luck.
My two models:
class User(AbstractBaseUser, PermissionsMixin):
email = models.EmailField(db_index=True, unique=True, max_length=200)
customer_code = models.CharField(max_length=300, blank=True, null=True, default=None)
class Bill(models.Model):
customer = models.ForeignKey(
User, on_delete=models.CASCADE, blank=True, null=True, related_name="customer_bill"
)
payable_amount = models.DecimalField(max_digits=10, decimal_places=2, default=0)
View:
class BillView(APIView):
def get(self, request, format=None):
q = Bill.objects.all().select_related('customer')
s = BillSerializer(q, many=True)
return JsonResponse({
"bill": s.data
})
Serializer:
class BillSerializer(serializers.ModelSerializer):
customer_code = serializers.CharField(source='user.customer_code', read_only=True)
class Meta:
model = Bill
fields = ('id','payable_amount','customer_code') # binding customer_code here
Current Output:
"bill": [
{
"id": 1,
"payable_amount": "1000.00"
},
{
"id": 2,
"payable_amount": "2000.00"
}
]
Expected Result:
"bill": [
{
"id": 1,
"payable_amount": "1000.00",
"customer_code": "CUS10001" # want this to be attached
},
{
"id": 2,
"payable_amount": "2000.00",
"customer_code": "CUS10002" # want this to be attached
}
]
I have user like this:
{
"name": "test"
"parent_users": [
1,
2
]
}
I need to display the user "name": "test" two times becouse he has two parents, for example i need to display the user "name": "test" like this:
{
"name": "test"
"parent_user": 1
}
{
"name": "test"
"parent_user": 2
}
My serializer
class CommitmentListSerializer(serializers.ModelSerializer):
class Meta:
model = User
fields = ('id',
'email',
'first_name',
'last_name',
'parent_user',)
I cant understand how i can to create quesryset for this
UPD
user model
class User(PermissionsMixin):
id = models.CharField(primary_key=True,
unique=True,
max_length=128,
default=uuid.uuid4,
editable=False)
email = models.EmailField(
_('email address'),
max_length=100,
unique=True,
null=True,
blank=True,
default=None,
error_messages={'unique': _("A user with that email already exists.")}
)
...
# another fields
...
parent_user = models.ManyToManyField('self',
unique=False,
symmetrical=False,
blank=True)
...
I have first made category crud, and then product crud with many-to-many relation with category.
models.py (category):
class Category(models.Model):
name = models.CharField(max_length=191, blank=False, null=False)
description = models.TextField(blank=True, null=True)
models.py (product):
class Product(models.Model):
product_code = models.CharField(max_length=191, blank=False, null=False)
name = models.CharField(max_length=191, blank=False, null=False)
description = models.TextField(blank=False, null=False)
price = models.DecimalField(max_digits=19, decimal_places=2)
photo = models.ImageField(upload_to='pictures/products/', max_length=255, null=False, blank=False)
category = models.name = models.ManyToManyField(Category)
How to achieve following result:
{
"categories": [
{
"id": 1,
"name": "Indoor Muscle Training",
"description": null,
"products":{
"name":"product_name",
"code":"product_code"
}
},
{
"id": 2,
"name": "Outdoor Muscle Training",
"description": null,
"products":{
"name":"product_name",
"code":"product_code"
}
}
]
}
using serializer-method field can be an option for this case. Our goal is get product information from category serializer. So for this
class CategorySerializer(serializers.ModelSerializer):
products = serializers.SerializerMethodField()
class Meta:
model = Category
fields = ('') # add relative fields
def get_products(self, obj):
products = obj.product_set.all() # will return product query set associate with this category
response = ProductSerializer(products, many=True).data
return response
I am trying to nest my Users table inside my Relationships table. So instead of this:
[
{
"user": 1,
"related_user": 2,
"relationship": "followed_by"
}
]
I am trying to get this:
[
{
"user": {
"username": "user1",
"name": "User 1",
"email": "bla",
"phone": "bla",
"date_joined": "2017-11-01T21:34:13.101256Z"
},
"related_user": {
"username": "user2",
"name": "User 2",
"email": "bla",
"phone": "bla",
"date_joined": "2017-11-01T21:34:13.101256Z"
},
"relationship": "followed_by"
}
]
I looked up tutorials and I tried adding serializers.RelatedField , UserSerializer(many=true, read-only=true) etc. but nothing worked
Models.py
class User(models.Model):
username = models.CharField(max_length=255)
name = models.CharField(max_length=255)
email = models.CharField(max_length=255)
phone = models.CharField(max_length=255)
date_joined = models.DateTimeField(auto_now_add=True, blank=True)
def __str__(self):
return str(self.pk) + ", " + self.username
RELATIONSHIP_CHOICE = [
("follows", "follows"),
("followed_by", "followed_by"),
("none", "none"),
]
class Relationship(models.Model):
user = models.ForeignKey(User, related_name="primary_user", null=True)
related_user = models.ForeignKey(User, related_name="related_user", null=True)
relationship = models.CharField(max_length=40, choices=RELATIONSHIP_CHOICE, default=RELATIONSHIP_CHOICE[0])
Serializers.py
from rest_framework import serializers
from . import models
class UserSerializer(serializers.ModelSerializer):
class Meta:
model = models.User
fields = (
'username',
'name',
'email',
'phone',
'date_joined',
)
class RelationshipSerializer(serializers.ModelSerializer):
related_user = UserSerializer(many=True)
class Meta:
model = models.Relationship
fields = (
'user',
'related_user',
'relationship',
'related_user'
)
I tried to add related user to my serializer but it didnt work. I am getting an error: 'User' object is not iterable
Any help is appreciated.
class RelationshipSerializer(serializers.ModelSerializer):
user = UserSerializer(read_only=True)
related_user = UserSerializer(read_only=True)
class Meta:
model = models.Relationship
fields = (
'user',
'related_user',
'relationship'
)
user = UserSerializer(read_only=True, many=True) is for manytomany field,user = UserSerializer(read_only=True) is for ForeignKey field.