2017-09-04 53 views
1

我有两个模型RequestsEvents有外键回到User模型。当试图使用Django Rest Framework发布外键数据时,我收到一个空约束错误。看来django不接受user_idrequester_idevent_admin_id)引用。在可浏览的API中,外键部分(requester_idevent_id)不存在。它被某物隐藏了吗?请注意,event_participant仅由外键组成,但它们在发布时显示在可浏览的API中。我不知道这可能是区别models.ForeignKey字段没有显示在可浏览的API

Missing event_admin_id foreignkey field Missing request_admin_id fk field

models.py

from django.db import models 
from django.contrib.auth.models import AbstractUser 

# Create your models here. 
class User(AbstractUser): 
    user_job_description = models.CharField(max_length = 200) 
    user_profile_pic = models.ImageField(null = True, blank = True) 


class Event(models.Model): 
    def __str__(self): 
     return self.event_name 
    event_name = models.CharField(max_length = 100) 
    event_location = models.CharField(max_length = 100) 
    event_description = models.TextField(max_length = 300) 
    admin_user_id = models.ForeignKey(User, related_name = 'event_admin') 

class Request(models.Model): 
    def __str__(self): 
     return self.request_desc 
    requester_user_id = models.ForeignKey(User, related_name = 'requests') 
    request_desc = models.TextField(max_length = 100) 
    fulfiller_user_id = models.IntegerField(null = True, blank = True) 
    fulfilled_status = models.BooleanField() 


class Event_Participant(models.Model): 
    def __str__(self): 
     return str(self.event_id) 
    user_id = models.ForeignKey(User, related_name = 'event_attendee') 
    event_id = models.ForeignKey(Event, related_name = 'event') 

serializers.py

from django.contrib.auth import get_user_model 
from crewboardsdb.models import Event 
from crewboardsdb.models import Request 
from crewboardsdb.models import Event_Participant 
from rest_framework import serializers 


class UserSerializer(serializers.ModelSerializer): 
    requests = serializers.StringRelatedField(many = True) 
    event_admin = serializers.StringRelatedField(many = True) 
    event_attendee= serializers.StringRelatedField(many = True) 
    class Meta: 
     model = get_user_model() 
     fields = ('id','username','first_name','last_name','email','user_job_description','event_admin','requests', 'event_attendee',) 

class EventSerializer(serializers.ModelSerializer): 
    admin_user_id = serializers.StringRelatedField() 
    class Meta: 
     model = Event 
     fields = ('id', 'event_name', 'admin_user_id', 'event_description', 'event_location',) 
     lookup_field = 'admin_user_id' 




class RequestSerializer(serializers.ModelSerializer): 

    requester_user_id = serializers.StringRelatedField() 
    class Meta: 
     model = Request 
     fields = ('id', 'request_desc', 'fulfilled_status','requester_user_id','fulfiller_user_id',) 
     lookup_field = 'requester_user_id' 




class EventParticipantSerializer(serializers.ModelSerializer): 
    class Meta: 
     model = Event_Participant 
     fields = ('id', 'event_id', 'user_id') 
+0

我应该补充说,这些字段昨天可见,我不知道什么可以改变。 – user2904913

回答

1

希望这仍然是积极,有同样的问题他们刚才想出来了。

在我的情况下,我也遇到了完全相同的问题,外键相关的属性没有显示在可浏览的api内,所以我认为它必须是序列化程序的东西。

原来就是这个问题。如果你有一个ForeignKey约束,你根本不需要处理nestes序列化器,只是把它们放在你的序列化器类中!

在你的情况,这将是这样的:

(Event Model) 
class Event(models.Model): 
    def __str__(self): 
     return self.event_name 
    event_name = models.CharField(max_length = 100) 
    event_location = models.CharField(max_length = 100) 
    event_description = models.TextField(max_length = 300) 
    admin_user_id = models.ForeignKey(User, related_name = 'event_admin') 

这里您admin_user_id可能未显示在你浏览的API了属性。现在

,这是你的那个类串行如何有看起来像:

class EventSerializer(serializers.ModelSerializer): 
    class Meta: 
     model = Event 
     fields = ('id', 'event_name', 'admin_user_id', 'event_description', 'event_location',) 
     lookup_field = 'admin_user_id' 

注意,只是裁剪线admin_user_id = serializers.StringRelatedField()做的工作,现在你的API应该显示领域的预期和你能够选择一个用户来链接这个对象。

我在我自己的项目中通过简单地考虑你的模型和序列化程序来测试你的问题,按照这个简单的步骤完成了这项工作!

希望这仍然可以帮助你或任何人在未来。干杯。

相关问题