我是新手
Django Rest Framework
编写第一个API应用程序。
我的
联系人/型号。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
联系人/搜索器。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 ''
联系人/视图。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})
哪里
ContactViewSet
可通过访问
http://<ip>:<port>/api/contacts
和
ContactList
可通过访问
http://<ip>:<port>/contacts
http://<ip>:<端口(>)/api/联系人
正在给予
primary\u电子邮件
在json响应中,但在
列表html
{{ contact.primary_email }}
使用**APIView时不能使用序列化程序字段
**
是否需要重写
ContactList()
要获取primary\u电子邮件字段?
编辑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 %}
这是打印用户的全名,但不是主要电子邮件