【发布时间】:2018-05-13 10:28:25
【问题描述】:
我是 Django Rest Framework 的新手,正在编写第一个 API 应用程序。
我的contacts/models.py
class Contact(models.Model):
user_id = models.ForeignKey(User, on_delete=models.CASCADE)
first_name = models.CharField(max_length=100)
last_name = models.CharField(max_length=100, blank=True, null=True)
date_of_birth = models.DateField(blank=True, null=True)
class Meta:
db_table = 'contacts'
def full_name(self):
return self.first_name + ' ' + self.last_name
def __str__(self):
return self.full_name()
class ContactEmail(models.Model):
contact = models.ForeignKey(Contact, on_delete=models.CASCADE)
email = models.EmailField()
primary = models.BooleanField(default=False)
class Meta:
db_table = 'contact_emails'
def __str__(self):
return self.email
contacts/searializers.py
class ContactSerializer(serializers.HyperlinkedModelSerializer):
primary_email = serializers.SerializerMethodField()
class Meta:
model = Contact
fields = ('url', 'full_name', 'date_of_birth', 'primary_email')
def get_primary_email(self, obj):
primary_email = obj.contactemail_set.filter(primary=True).first()
if primary_email:
return primary_email.email
return ''
contacts/views.py
class ContactViewSet(viewsets.ModelViewSet):
queryset = Contact.objects.all()
serializer_class = ContactSerializer
permission_classes = (permissions.IsAuthenticatedOrReadOnly,
IsOwnerOrReadOnly,)
def perform_create(self, serializer):
serializer.save(user_id=self.request.user)
class ContactList(APIView):
renderer_classes = [TemplateHTMLRenderer]
template_name = 'contacts/list.html'
permission_classes = (permissions.IsAuthenticatedOrReadOnly,)
def get(self, request):
queryset = Contact.objects.all()
return Response({'contacts': queryset})
http://<ip>:<port>/api/contacts 可以访问ContactViewSet,http://<ip>:<port>/contacts 可以访问ContactList
http://<ip>:<port>/api/contacts 在 json 响应中给出 primary_email 但在 list.html {{ contact.primary_email }}
我不能在使用 **APIView 时使用序列化器字段吗?**
是否需要重写ContactList()中的函数来获取primary_email字段?
编辑 2:
contacts/list.html
{% for contact in contacts %}
<h4 class="card-title">{{ contact.full_name }}</h4>
<h5>{{ contact.primary_email }}
<a href="{% url 'contact:detail' contact.pk %}">Click here</a>
{% endfor %}
这是打印用户的全名,但不是主电子邮件
【问题讨论】:
-
可以看到
contacts/list.html吗? -
见
Edit 2。已添加contacts/list.html
标签: django django-rest-framework