Home > Net >  Django rest framework not returning all fields
Django rest framework not returning all fields

Time:09-17

I am trying to make a model that stores favorite shows for users, and I have been using viewsets. I have a users and shows viewset that work just like I expect them to, and I have another model that simply stores relationships between users and shows. When I add that as a viewset though, I get the id, and user, and I don't get a show.

Here are the results for the favorites:

[
   {
      "id":2,
      "user":{
         "username":"poduck",
         "first_name":"",
         "last_name":"",
         "email":"[email protected]",
         "image":null,
         "url":"http://0.0.0.0:8000/api/users/poduck/?format=json"
      }
   }
]

There isn't even a show field. It's not like the data isn't there either. I have been able to use queries on the data with no trouble. I have access to both the show and the user from the favorite.

I thought that maybe that the fact that the show points to a user, and the favorite points to a user that there may be some circular conflict there, but beyond excluding the user field from the Show serializer, I don't know what to do to fix that, and yes, I did try excluding it from the Show serializer.

shows.models:

from django.db import models
from django.utils.translation import gettext_lazy as _
from localflavor.us.models import USStateField, USZipCodeField
from users.models import User
from phonenumber_field.modelfields import PhoneNumberField


# Create your models here.
class Show(models.Model):
    # Information
    title = models.CharField(_("Title"), blank=False, max_length=255)
    location = models.CharField(_("Location Name"), blank=False, max_length=255)
    image = models.ImageField(upload_to='show_images', blank=True)
    description = models.TextField(_("Description"), blank=False)
    start_date = models.DateField(_("Start Date"), blank=False)
    end_date = models.DateField(_("End Date"), blank=False)
    registration_start = models.TimeField(_("Registration Start Time"), blank=False)
    registration_end = models.TimeField(_("Registration End Time"), blank=False)
    start_time = models.TimeField(_("Spectator Start Time"), blank=False)
    end_time = models.TimeField(_("Spectator End Time"))
    address = models.CharField(_("Show Address"), blank=False, max_length=255)
    city = models.CharField(_("City"), blank=False, max_length=255)
    state = USStateField(_("State"), blank=False, max_length=2)
    zip = USZipCodeField(_("Zip Code"), blank=False)
    contact_name = models.CharField(_("Contact name"), blank=True, max_length=255)
    contact_email = models.EmailField(_("Contact Email"), blank=True, max_length=255)
    contact_phone = PhoneNumberField(_("Contact Phone"), blank=True)
    website = models.URLField(_('Official website'), blank=True)
    entry_fee = models.DecimalField(_('Entry fee'), default=0.00, blank=False, decimal_places=2, max_digits=10)
    spectator_entry_fee = models.DecimalField(_('Spectator entry fee'), default=0.00, blank=False, decimal_places=2, max_digits=10)
    trophies = models.BooleanField(_("Trophies or Ribbons Awarded"), default=False)
    dash_plaques = models.BooleanField(_("Dash Plaques Given"), default=False)
    dash_plaque_quantity = models.IntegerField(_("Quantity of dash plaques to be given"), null=True, blank=True)
    door_prizes = models.BooleanField(_("Door Prizes"), default=False)
    judging = models.BooleanField(_("Professional Judging"), default=False)
    user = models.ForeignKey(User, on_delete=models.CASCADE)
    created = models.DateTimeField(auto_now_add=True)
    modified = models.DateTimeField(auto_now=True)

    def __str__(self):
        return f"{self.title}"


class Favorite(models.Model):
    show = models.ForeignKey(Show, on_delete=models.CASCADE)
    user = models.ForeignKey(User, on_delete=models.CASCADE)

    def __str__(self):
        return f"{self.show.title}"

shows.api.serializers:

from rest_framework import serializers
from shows.models import Show, Favorite
from users.api.serializers import UserSerializer


class ShowSerializer(serializers.ModelSerializer):
    user = UserSerializer()

    class Meta:
        model = Show
        fields = '__all__'


class FavoriteSerializer(serializers.ModelSerializer):
    show = ShowSerializer(many=True, read_only=True)
    user = UserSerializer()

    class Meta:
        model = Favorite
        fields = '__all__'

shows.api.viewsets:

from car_show_helper.shows.models import Show
from .serializers import ShowSerializer, FavoriteSerializer
from rest_framework import viewsets


class ShowViewSet(viewsets.ModelViewSet):
    queryset = Show.objects.all()
    serializer_class = ShowSerializer


class FavoriteViewSet(viewsets.ModelViewSet):
    queryset = Show.objects.all()
    serializer_class = FavoriteSerializer

And finally the api_router:

from django.conf import settings
from rest_framework.routers import DefaultRouter, SimpleRouter

from car_show_helper.users.api.views import UserViewSet
from car_show_helper.shows.api.viewsets import ShowViewSet, FavoriteViewSet


if settings.DEBUG:
    router = DefaultRouter()
else:
    router = SimpleRouter()

router.register("users", UserViewSet)
router.register("shows", ShowViewSet, basename="shows")
router.register("favorites", FavoriteViewSet, basename="favorites")


app_name = "api"
urlpatterns = router.urls

Any help would be appreciated.

CodePudding user response:

First, change queryset inside FavoriteViewSet

class FavoriteViewSet(viewsets.ModelViewSet):
    queryset = Show.objects.all()
    serializer_class = FavoriteSerializer

to

queryset = Favorite.objects.all()

Second, remove many=True from:

show = ShowSerializer(read_only=True, many=True)
  • Related