为许多字段制作检索api



我正在制作一个带有django rest框架的API,它应该做的是,它必须返回某个名人曾经出演或导演的电影。

我不知道该怎么做。因为film模型有很多名为filmActor和filmDirector的字段,我想最好通过扩展ModelSerializer类来制作这个api。

# Models.py
class Celebrity(models.Model):
celebID = models.AutoField(primary_key=True)
nameOf = models.CharField(max_length=100, unique=True)
details = models.TextField(null=True)
class Film(models.Model):
filmID = models.AutoField(primary_key=True)
title = models.CharField(max_length=150)
filmActor = models.ManyToManyField(Celebrity, related_name='actor')
filmDirector = models.ManyToManyField(Celebrity, related_name='director')
# Serializers.py
class CelebrityRetrieveSerializer(serializers.ModelSerializer):
# TO BE DONE

由于&quot_设置";。像这样的东西应该起作用:

class FilmSerializer(serializers.ModelSerializer):
class Meta:
model = Film
fields = ('filmID', 'title')
class GenreRetrieveSerializer(serializers.ModelSerializer):
film_set = FilmSerializer(many=True)

class Meta:
model = Genre
fields = '__all__'

@ThomasGth给出的答案仅在您有1个外键或多对多字段时有效。

要使用两个外键来完成此操作,您必须将serializers.py中的字段命名为models.py中related_name字段的名称,因此代码应该是这样的:

class CelebrityRetrieveSerializer(serializers.ModelSerializer):
class FilmSerializer(serializers.ModelSerializer):
class Meta:
model = Film
fields = ('title',)

actor = FilmSerializer(read_only=True, many=True,)
director = FilmSerializer(read_only=True, many=True,)
class Meta:
model = Celebrity
fields = '__all__'

您还必须确保为related_name指定一个值,该值与您在代码中使用的其他名称不冲突。例如,如果将其设置为related_name = Film,则可能会导致问题。

模型.py

class Actor(models.Model):
image = models.ImageField("Image", upload_to='cast/')
name = models.CharField("Name", max_length=255)
type = models.CharField('Type', max_length=255, default='Actor')
description = models.TextField('About')
slug = models.SlugField("Link", unique=True)
class Meta:
verbose_name = "Actor"
verbose_name_plural = "Cast"
def current_path(self):
return "/Actor/" + str(self.name) + "/"
def get_absolute_url(self):
return reverse('actor_detail_url', kwargs={'slug': self.slug})
def __str__(self):
return self.name
class Movie(models.Model):
poster = models.ImageField(
'Poster', blank=True, upload_to='posters/')
movie = models.FileField("Movie Copy", upload_to="movies/")
title = models.CharField('Title', max_length=255)
description = models.TextField('Description')
genre = models.ManyToManyField(
Genre, blank=True, verbose_name='Genre')
director = models.ManyToManyField(
Director, blank=True, verbose_name='Director')
cast = models.ManyToManyField(
Actor, blank=True, verbose_name='Cast')
imdb_rating = models.ForeignKey(
IMDb_Rating, on_delete=models.CASCADE, null=True, verbose_name="IMDb Rating")
rotten_tomatoes_rating = models.ForeignKey(
Rotten_Tomatoes_Rating, on_delete=models.CASCADE, null=True, verbose_name="Rotten Tomatoes Rating")
other_rating = models.ForeignKey(
Other_Rating, on_delete=models.CASCADE, null=True,     verbose_name="Other Rating")
budget = models.CharField('Budget', max_length=255,
default="20 million", blank=True)
box_office = models.CharField(
'Box Office', max_length=255, default="1.50 billion", blank=True)
composers = models.ManyToManyField(
Composer, blank=True, verbose_name="Composers")
date = models.DateField('Release Date', default=timezone.now)
country = CountryField(blank_label='Select Country')
Quality = models.CharField("Quality", max_length=255, default="720p")
runtime = models.CharField("Runtime", max_length=255, default="1h 20m")
publication = models.BooleanField("Publication", default=True)
slug = models.SlugField('Link', unique=True)
class Meta:
verbose_name = 'Movie'
verbose_name_plural = 'Movies'
def get_absolute_url(self):
return reverse('movie_detail_url', kwargs={'slug': self.slug})
def __str__(self):
return self.title

movie_detail.html

<div class="cast-column">
{% for actor in movie.cast.all %}
<a href="{% url 'actor_detail_url' actor.slug %}">
<div class="actor" style="{% if not forloop.first %} margin-left: 8px; {% endif %}">
<div class="actor-picture">
<img src="{{actor.image.url}}" alt="{{actor.name}}">
</div>
<div class="actor-n_r">
<div class="actor-name">{{actor.name}}</div>
<div class="actor-role">{{role.role}}</div>
</div>
</div>
</a>
{% endfor %}
</div>

最新更新