首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >django-fsm中的状态转换错误,并将当前状态重置为默认值

django-fsm中的状态转换错误,并将当前状态重置为默认值
EN

Stack Overflow用户
提问于 2020-07-21 11:54:19
回答 1查看 345关注 0票数 0

我有一个订单模型,它有一个字段status,它有选项-> NEW (默认),PENDING(PDG),DISPATCHED(DSP),COMPLETED(CMP),CLD(CLD)

models.py

代码语言:javascript
复制
class Order(Address, TimeStampedUUIDModel):

    status = FSMField(
        max_length=25,
        choices=constants.STATUS_CHOICES,
        default=constants.NEW,
    )

    @transition(field=status, source=constants.NEW, target=constants.PDG)
    def to_pending(self):
        self.status = constants.PDG


    @transition(field=status, source=constants.PDG, target=constants.DSP)
    def to_dispatched(self):
        self.status = constants.DSP


    @transition(field=status, source=constants.DSP, target=constants.CMP)
    def to_completed(self):
        self.status = constants.CMP


    @transition(
        field=status,
        source=[constants.NEW, constants.PDG, constants.DSP],
        target=constants.CLD,
    )
    def to_cancel(self):
        self.status = constants.CLD

serializers.py

代码语言:javascript
复制
class OrderSerializer(serializers.ModelSerializer):
    class Meta:
        model = models.Order
        fields = "__all__"
        read_only_fields = [--all fields except status--]

    def update(self, instance, validated_data):
        status = validated_data.pop("status", None)
        agent =  self.context['request'].user
        instance = services.status_function(status, instance, agent)
        return instance

在下面的服务文件中,我同时尝试创建一个order活动对象来跟踪Order对象中的更改。services.py

代码语言:javascript
复制
def status_function(status, instance, agent):
    if status is not None:
        switcher = {
            constants.PDG : instance.to_pending,
            constants.DSP : instance.to_dispatched,
            constants.CMP : instance.to_completed,
            constants.CLD : instance.to_cancel
        }
        func = switcher.get(status, None)
        try:
            func()
            models.OrderActivity.objects.create(
                event_name=status,
                order = instance,
                event = f"Order {status}",
                agent = agent,
                time = instance.modified_at
            )
        except TransitionNotAllowed :
            print("Exception Caught")
            raise exceptions.BadRequest([{"error": "Transition not allowed"}])

    return instance

constants.py

代码语言:javascript
复制
from extended_choices import Choices

## Order Status
NEW, NEW_ = "NEW", "NEW"
PDG, PDG_ = "PDG", "PENDING"
DSP, DSP_ = "DSP", "DISPATCHED"
CMP, CMP_ = "CMP", "COMPLETED"
CLD, CLD_ = "CLD", "CANCELLED"

STATUS_CHOICES = ( 
    (NEW, NEW_), 
    (PDG, PDG_), 
    (DSP, DSP_), 
    (CMP, CMP_),
    (CLD, CLD_),
)

我的问题是,除了NEW Order PDG、NEW Order CLD和PDG -> CLD之外的其他转换都会引发异常,并且还会将->对象的状态恢复为NEW,这是不应该发生的。提前感谢!

EN

回答 1

Stack Overflow用户

发布于 2020-07-21 17:23:21

从每个转移函数中删除赋值

将每个转换函数更改为:

代码语言:javascript
复制
    def to_completed(self):
            return

因为状态是通过调用函数本身改变的。但不会在数据库中更改。所以我们只需要保存实例本身。services.py put中的func()下面

instance.save()

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

https://stackoverflow.com/questions/63007103

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档