Loading [MathJax]/jax/output/CommonHTML/config.js
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >问答首页 >使用SlugRelatedField创建和保存外键对象

使用SlugRelatedField创建和保存外键对象
EN

Stack Overflow用户
提问于 2015-01-18 04:47:53
回答 3查看 11.9K关注 0票数 23

我刚开始使用Django REST框架,在保存外键方面遇到了困难。我有一个Merchant模型和一个Phone模型。Phone有一个Merchant的外键。当向POST请求Merchant时,我希望为请求中提供的数字创建Phone对象。但是当我提供电话号码时,它会给出以下错误

对象不存在phone=0123456789。

我只想让它自己创建Phone对象。下面是我使用的模型:

代码语言:javascript
运行
AI代码解释
复制
class Merchant(models.Model):
    merchant_id       = models.CharField(max_length=255)
    name              = models.CharField(max_length=255)
    is_active         = models.BooleanField(default=True)

    class Meta:
        managed = True
        db_table = 'merchant'

    # Managers
    objects = models.Manager()
    active = managers.ActiveManager()

class Phone(models.Model):
    phone      = models.CharField(max_length=255)
    merchant   = models.ForeignKey('merchant.Merchant',
                                    related_name='phones',
                                    blank=True,
                                    null=True)

    class Meta:
        managed = True
        db_table = 'phone'

下面是我使用它们的视图和序列化程序。

代码语言:javascript
运行
AI代码解释
复制
class MerchantSerializer(serializers.ModelSerializer):
    phones = serializers.SlugRelatedField(
        many=True,
        slug_field='phone',
        queryset=primitives.Phone.objects.all())

    class Meta:
        model = Merchant
        fields = (
            'merchant_id',
            'name',
            'is_active',
            'phones',
        )

class MerchantViewSet(viewsets.ModelViewSet):
    queryset = Merchant.active.all()
    serializer_class = MerchantSerializer

我的请求身体是这样的:

代码语言:javascript
运行
AI代码解释
复制
{
    "merchant_id": "emp011",
    "name": "Abhinav",
    "is_active": true,
    "phones": [
        "0123456789",
        "9876543210"
    ]
}

以下是我们的回应:

400个错误请求

代码语言:javascript
运行
AI代码解释
复制
{"phones":["Object with phone=0123456789 does not exist."]}
EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2015-01-18 08:15:26

与许多相关字段一样,Django REST框架提供的SlugRelatedField被设计用于已经存在的对象。由于您正在寻找已经存在的引用对象,或者需要创建的对象,所以您将无法按原样使用它。

当新对象不存在时,您将需要一个自定义SlugRelatedField来创建新对象。

代码语言:javascript
运行
AI代码解释
复制
class CreatableSlugRelatedField(serializers.SlugRelatedField):
    
    def to_internal_value(self, data):
        try:
            return self.get_queryset().get_or_create(**{self.slug_field: data})[0]
        except ObjectDoesNotExist:
            self.fail('does_not_exist', slug_name=self.slug_field, value=smart_text(data))
        except (TypeError, ValueError):
            self.fail('invalid')

class MerchantSerializer(serializers.ModelSerializer):
    phones = CreatableSlugRelatedField(
        many=True,
        slug_field='phone',
        queryset=primitives.Phone.objects.all()
    )

    class Meta:
        model = Merchant
        fields = (
            'merchant_id',
            'name',
            'is_active',
            'phones',
        )

通过切换到get_or_create,如果电话号码对象还不存在,就会创建它。如果需要在模型上创建其他字段,则可能需要对此进行调整。

票数 40
EN

Stack Overflow用户

发布于 2020-01-08 17:53:12

在凯文回答的基础上,由于没有使用get_or_create[0],海事组织稍微干净了一点

代码语言:javascript
运行
AI代码解释
复制
class CreatableSlugRelatedField(serializers.SlugRelatedField):
    def to_internal_value(self, data):
        try:
            return self.get_queryset().get(**{self.slug_field: data})
        except ObjectDoesNotExist:
            return self.get_queryset().create(**{self.slug_field: data})  # to create the object
        except (TypeError, ValueError):
            self.fail('invalid')

注意,相关对象中唯一需要的字段应该是段塞字段。

票数 4
EN

Stack Overflow用户

发布于 2015-01-18 05:04:07

您必须为对象Phone的phone字段指定一个值。如果希望在不指定字段电话值的情况下创建phone对象,则必须启用空字段和空白字段。

代码语言:javascript
运行
AI代码解释
复制
phone = models.CharField(max_length=255,null=true,blank=true)

如果仍然遇到问题,请确保post数据包含所需的字段。为此您可以使用ipdb

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/28009829

复制
相关文章
MySQL外键约束使用
在MySQL中,外键约束用于确保两个表之间的数据一致性。外键约束是一种限制,它将一个表中的列与另一个表中的列相关联。具体来说,它要求在一个表中的某个列中的值必须在另一个表的某个列中存在。外键约束可以确保数据的完整性和一致性,防止数据被删除或修改时发生错误。
堕落飞鸟
2023/05/11
4.3K0
SQLAlchemy外键的使用
orm可以将数据库存储的数据封装成对象,同时,如果封装的好的话,所有的数据库操作都可以封装到对象中。这样的代码在组织结构上会非常的清晰,并且相对与使用sql语句在sql注入方面会极具降低。 SQLAlchemy中的映射关系有四种,分别是一对多,多对一,一对一,多对多 实现这种映射关系只需要外键(ForeignKey),和relationship 一对多: from sqlalchemy.ext.declarative import declarative_base from sqlalchemy impor
用户1173509
2018/01/17
2.4K0
gorm指定外键和关联外键
一直分不清association_foreignkey和foreignkey的作用,此文总结一下
平凡的学生族
2019/12/24
6.9K0
gorm指定外键和关联外键
外键约束
外键约束 foreign key 外键约束的要求: 父表和字表必须使用相同的存储引擎,禁止使用临时表; 数据库引擎只能是InnoDB; 外键列和参照列必须具有相似的数据类型,数字的长度或者是否有符号必须一样,字符长度可以不不一样; 外键列和参照列必须创建索引,参照列没有索引,mysql回自动创建索引; ----------- 下面创建两个数据表 1(父表)省份表两个字段 id (主键) 省份名称 2(子表)用户表三个字段 id (主键) 用户名称 省份编号(外键对应省表的主键id类型一样,因为需要把这个设
前朝楚水
2018/04/04
2.1K0
外键约束
     2.设置外键约束的两个表之间会有 父子关系 ,即字表中外键字段的取值范围 取决于 父表
全栈程序员站长
2022/09/06
1.7K0
明了 | MongoDB 外键的基本使用
而在MongoDB中,表示表关系,使用的是嵌套,即,一个文档嵌套一个文档的方法,作为MongoDB的两个文档的关联,以及使用,reference link作为文档和文档之间的关联。
mySoul
2020/07/22
1.9K0
每日一库:GORM 外键使用
在 GORM 中使用外键涉及到在结构体定义中指定外键关系以及数据库迁移时的操作。下面是一个使用 GORM 定义外键的示例:
孟斯特
2023/10/19
1.3K0
每日一库:GORM 外键使用
外键的设置
② 外键列必须建立了索引,MySQL 4.1.2以后的版本在建立外键时会自动创建索引,但如果在较早的版本则需要显式建立;
诡途
2022/05/09
2.8K0
外键的设置
Python面向对象编程-类和对象-对象的创建和使用
在Python中,对象是一种数据结构,它封装了数据和行为,并允许对它们进行操作。对象是根据类定义的,它们具有类定义的属性和方法。本文将介绍如何在Python中创建和使用对象。
玖叁叁
2023/04/19
1.2K0
mysql的外键
在MySQL 3.23.44版本后,InnoDB引擎类型的表支持了外键约束。 外键的使用条件: 1.两个表必须是InnoDB表,MyISAM表暂时不支持外键(据说以后的版本有可能支持,但至少目前不支持); 2.外键列必须建立了索引,MySQL 4.1.2以后的版本在建立外键时会自动创建索引,但如果在较早的版本则需要显示建立; 3.外键关系的两个表的列必须是数据类型相似,也就是可以相互转换类型的列,比如int和tinyint可以,而int和char则不可以; 外键的好处:可以使得两张表关联,保证数据的一致性
java达人
2018/01/31
5.6K0
MySQL外键约束
关系键是关系数据库的重要组成部分。关系键是一个表中的一个或几个属性,用来标识该表的每一行或与另一个表产生联系。 其中就包括外键
JavaEdge
2022/11/29
6.7K0
MySQL外键约束
Mysql外键约束
如果表A的主关键字是表B中的字段,则该字段称为表B的外键,表A称为主表,表B称为从表。外键是用来实现参照完整性的,不同的外键约束方式将可以使两张表紧密的结合起来,特别是修改或者删除的级联操作将使得日常的维护工作更加轻松。外键主要用来保证数据的完整性和一致性 两个表必须是InnoDB表,MyISAM表暂时不支持外键 外键列必须建立了索引,MySQL 4.1.2以后的版本在建立外键时会自动创建索引,但如果在较早的版本则需要显示建立; 外键关系的两个表的列必须是数据类型相似,也就是可以相互转换类型的列,比如in
暖月寒星
2020/03/10
6K0
MySQL外键约束
外键其实很好理解,简单的说就是两张表建立一个连接关系。这里我们那主表A和副表B举例,我A表中有用户信息,B表中有用户订单信息。要是数据完整对应起来,肯定是需要把两张表关联起来,我们因此会在B表中村一个A表的字段,常见的我们存的是A表的主键ID外键。
兔云小新LM
2019/08/02
6.1K0
外键(FOREIGN KEY)
1、表的组织结构复杂不清晰 2、浪费空间 3、扩展性极差
全栈程序员站长
2022/09/07
9600
Oracle 数据库创建外键后禁用外键的方法
我们创建外键后,可能有时会遇到要禁用外键的情况,那么在Oracle中,我们如何对外键进行禁用呢?
用户8965210
2021/09/02
3.2K0
【说站】mysql使用foreign key创建外键
2、外键foreign key用于约束破坏表格的连接动作,保证两个表格的数据完整性。
很酷的站长
2022/11/23
1.3K0
MySQL外键使用详解--Java学习网
最近有开始做一个实验室管理系统,因为分了几个表进行存储・所以要维护表间的关联・・研究了一下MySQL的外键。
用户1289394
2021/07/09
9410
MySql---外键复习
其中:外键名为定义的外键约束的名称,一个表中不能有相同名称的外键;字段名表示子表被外健约束的字段名;主表名即被子表外键所依赖的表的名称;主键列表示主表中定义的主键列或者列组合。
大忽悠爱学习
2021/11/15
5.4K0
重温MySQL外键约束
1、父表必须已经存在于数据库中,或者是当前正在创建的表。如果是后一种情况,则父表与子表是同一个表,这样的表称为自参照表,这种结构称为自参照。 2、必须为父表定义主键。 3、主键不能包含空值,但允许在外键中出现空值。也就是说,只要外键的每个非空值出现在指定的主键中,这个外键的内容就是正确的。 4、外键中列的数目必须和父表的主键中列的数目相同。 5、外键中列的数据类型必须和父表主键中对应列的数据类型相同。说这么多比较笼统,还是看看例子吧。
AsiaYe
2019/11/06
6.5K0
三十四、外键约束
参照完整性要求关系中不允许引用不存在的实体。在 MySQL 中设置参照完整性的方式是使用 外键约束 。所谓外键就是用于在两个表中的数据之间建立和加强链接的一列或多列的组合,可控制可在外键表中存储的数据。例如,有学生表和分数表两个表,表内容如下。
喵叔
2021/06/29
1.9K0

相似问题

SQLAlchemy:如何使用外键保存对象?

11

用外键保存对象

12

使用CrudRepository使用外键保存实体对象

30

在laravel中使用外键保存对象

22

保存外键对象django窗体

10
添加站长 进交流群

领取专属 10元无门槛券

AI混元助手 在线答疑

扫码加入开发者社群
关注 腾讯云开发者公众号

洞察 腾讯核心技术

剖析业界实践案例

扫码关注腾讯云开发者公众号
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档