【问题标题】:models.ForeignKey field not showing up in the browsable APImodels.ForeignKey 字段未显示在可浏览的 API 中
【发布时间】:2018-02-13 03:14:34
【问题描述】:

我有两个模型 RequestsEvents,它们的外键返回到 User 模型。尝试使用 Django Rest Framework 发布外键数据时,我收到 null 约束错误。 django 似乎不接受 user_idrequester_idevent_admin_id)引用。在可浏览的 API 中,外键部分(requester_idevent_id)不存在。是不是被什么东西隐藏了?请注意,event_participant 仅由外键组成,但它们在发布时出现在可浏览的 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')

【问题讨论】:

  • 我应该补充一点,这些字段昨天是可见的,我不确定会发生什么变化。

标签: python django django-rest-framework foreign-keys


【解决方案1】:

希望这仍然有效,刚才遇到了同样的问题并解决了。

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

事实证明这正是问题所在。如果您有 ForeignKey 约束,则根本不必处理嵌套序列化程序,只需将它们排除在序列化程序类之外!

在你的情况下,它会是这样的:

(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 应该按预期显示该字段,并且您可以选择将这个对象链接到的用户。

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

希望这仍然对您或将来的任何人有所帮助。干杯。

【讨论】:

  • 如果您删除 StringRelatedField,您确实会在可浏览的 api 中获得下拉菜单,但您放弃了响应中的字符串表示(这可能是首先使用该选项的全部意义)
猜你喜欢
  • 2021-02-23
  • 2016-04-04
  • 1970-01-01
  • 2014-06-07
  • 1970-01-01
  • 1970-01-01
  • 2020-09-02
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多