【问题标题】:Create a record for many-to-many in DRF在 DRF 中为多对多创建记录
【发布时间】:2016-06-27 02:04:27
【问题描述】:

我是 Django 的新手,我试图了解 Django Rest Framework 的工作。我没有得到并且我一直试图找出的是如何在数据库中创建一个具有多对多关系的新记录。我可以读取它并以 JSON 格式检索它,但我无法创建或修改它。 Django 为我创建了一个索引表,但我不知道如何使用它。 示例: 我有一个用户和用户标签。每个用户可以有更多的标签,每个标签可以分配给更多的用户。

class User(AbstractBaseUser, PermissionsMixin):
    category_tags = models.ManyToManyField(CategoryTag, blank=True, null=True)

什么类型的序列化程序以及我应该如何编写序列化程序以便我可以将一些标签分配给用户。例如,当一个新用户注册时,在注册过程中他会选择一些将分配给他的标签。 我可以创建一个新用户,但我不能使用 m2m(写)。

非常感谢。

【问题讨论】:

  • 请添加您的序列化程序
  • 这里是我的 UserSerializer pastebin.com/FC6g3v03 据我了解,我没有触及由 Django 创建的中间表,但我不明白如何在那里写一条新记录(索引)。
  • 您想创建新类别还是只添加与现有类别的关系?
  • 我有类别表和用户表,我需要为用户分配一些类别(每个用户一个或多个类别)。例如为项目或博客文章分配标签。
  • 答案有帮助吗?如果是,请接受。

标签: django django-models many-to-many django-rest-framework


【解决方案1】:

我假设您在 JSON 中发布了类别 ID 列表。然后您可以将您的create 方法调整为:

 def create(self, validated_data):
    generated_password = get_random_string(length=8)

    user = User.objects.create(
        email = validated_data['email'],
        full_name = validated_data['full_name']
    )

    user.set_password(generated_password)
    user.save()

    # loop over Categories and add many to many relationship
    for cat_id in validated_data('category_tags'):
        category = Category.objects.get(id=cat_id)
        user.category_tags.add(category)
    user.save()

    return user

您的 JSON 应该如下所示:

{
    "email": "some@mail.de",
    ... //other user fields
    "category_tags": [3, 12, 16]
}

【讨论】:

  • 我正在尝试这个解决方案,但不知何故它没有保存它......它确实保存了一个新用户,但它会在没有任何标签的情况下保存它......我猜是因为我没有将 category_tags 定义为一个字段在序列化器的顶部,但我不知道它应该是什么类型...
  • 可能是PrimaryKeyRelatedField。看看这里:django-rest-framework.org/api-guide/relations/…
  • 我之前尝试过...当我使用serializers.PrimaryKeyRelatedField(queryset=UserTag.objects.all()) 时会出现错误:<django.db.models.fields.related_descriptors.ManyRelatedManager object at 0x318a8d0> is not JSON serializable 而当我使用serializers.PrimaryKeyRelatedField(many=True, read_only=True) 时它不会做任何事情。
  • 也许这会有所帮助:adiyatmubarak.wordpress.com/tag/… 如果你不能让它工作,请创建一个新问题。
  • 我认为这篇文章是红色的,但它是关于只读的……我会尝试用整个 sn-p 发布一个新问题
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-04-30
  • 2023-03-09
  • 2021-12-07
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多