【问题标题】:Foreign Key Relation Problem in Django Rest Framework APIDjango Rest Framework API 中的外键关系问题
【发布时间】:2018-12-17 04:01:16
【问题描述】:

我有以下型号:

class Users(models.Model):
    user_id = models.UUIDField(primary_key=True, default=uuid.uuid4, editable=False)
    firstname = models.CharField(max_length=50)
    lastname = models.CharField(max_length=50)
    username = models.CharField(max_length=50, null=True, blank=True)
    home_page = models.CharField(max_length=100, null=True, blank=True)
    user_email = models.EmailField(max_length=70, unique=True)
    user_password = models.CharField(max_length=50)
    mobile_number = models.CharField(max_length=20, unique=True)
    is_active = models.BooleanField(default=True)


class Posts(models.Model):
    post_id = models.UUIDField(primary_key=True, default=uuid.uuid4, editable=False)
    user_id = models.ForeignKey(Users, on_delete=models.CASCADE)
    uri = models.CharField(max_length=45)
    title = models.CharField(max_length = 20)
    summary = models.CharField(max_length=30)
    post_body = models.CharField(max_length=3000)
    post_datetime = models.DateTimeField(auto_now_add=True)
    votes = models.IntegerField()
    location = models.CharField(max_length=200)

我有以下序列化程序:

class UsersSerializer(serializers.ModelSerializer):
    class Meta:
        model = models.Users
        fields = ('user_id', 'firstname', 'lastname', 'user_email', 'username',
                  'home_page', 'user_password', 'mobile_number', 'is_active')


class PostsSerializer(serializers.ModelSerializer):

    class Meta:
        model = models.Posts
        fields = ('post_id', 'user_id', 'uri', 'location', 'title', 'summary', 'post_body', 'post_datetime', 'votes')

这是我的查看代码:

class ListCreatePostsView(generics.ListCreateAPIView):
    queryset = Posts.objects.all()
    serializer_class = PostsSerializer

    def post(self, request, *args, **kwargs):
        a_Post = Posts.objects.create(
            user_id=request.data["user_id"],
            title=request.data["title"],
            location=request.data["location"],
            summary=request.data["summary"],
            post_body=request.data["post_body"],
            uri=request.data["uri"],
            votes=request.data["votes"]

        )
        return Response(
            data=PostsSerializer(a_Post).data,
            status=status.HTTP_201_CREATED
        )

我有一个使用 Django Rest Framework 运行的 API。但是,当我尝试将新帖子添加到特定的 user_id 时,我从 API 视图中收到以下错误:

Cannot assign "'528c2d9e-da2e-4c3d-9a92-eafb98e5d06e'": "Posts.user_id" must be a "Users" instance.

我的序列化器实现有问题吗? user_id 已在 Posts 模型中声明为外键。

DEMO API 的运行版本在这里:

https://thymesis-memories.herokuapp.com/api/memories/create

django-version: 2.1.3
DRS-version: 3.9.0 

【问题讨论】:

  • 您的查看代码在哪里?
  • 让我尽快添加它@RedCricket
  • user_id = models.ForeignKey(Users, on_delete=models.CASCADE) 这个属性将是一个User 对象,我想最好只将它重命名为user。 Posts().user_id 将给 Users()。为什么型号名称是复数?

标签: django python-3.x django-models django-serializer


【解决方案1】:

像这样更改帖子创建:

a_Post = Posts.objects.create(
        user_id_id = request.data['user_id'],  # <-- Here
        title=request.data["title"],
        location=request.data["location"],
        summary=request.data["summary"],
        post_body=request.data["post_body"],
        uri=request.data["uri"],
        votes=request.data["votes"]

    )

使用 user 而不是 user_id,因为它是 ForeignKey 字段,当您使用 user = ForeignKey(User) 时,您可以在 post.user_id 访问用户 ID。如果您将 FK 定义为 user,django 还会创建名为 user_id 的表列。

【讨论】:

  • 我已经尝试过您的代码,但出现以下错误:外键不匹配 - "memories_posts" 引用 "memories_users" PS:记忆是项目名称.. 根文件夹
  • 你确定吗?因为在更新的答案中我没有定义任何用户对象。
  • 我尝试了 objects.get(pk) 方法并得到以下错误:[“'Users object (528c2d9e-da2e-4c3d-9a92-eafb98e5d06e)' is not a valid UUID."]也许这是 UUID 的问题?也许将其更改为 Interger 可能会解决问题。
  • 它现在工作了。我已经按照你的建议改变了模型然后它工作了。
猜你喜欢
  • 1970-01-01
  • 2015-02-06
  • 2018-08-04
  • 2017-10-05
  • 1970-01-01
  • 2015-03-27
  • 2022-01-01
  • 2017-08-15
  • 2019-07-02
相关资源
最近更新 更多