Django rest framework 默认值随机标识符
Django rest framework default value random identifier
当我尝试在 MongoEngine 中保存 DynamicDocument 时,我试图调试一个奇怪的行为。
文档class声明如下:
class Command(DynamicDocument):
meta = {
'collection': 'executor_data_commands'
}
name = StringField()
args = DynamicField()
issued_at = LongField(default=time.time())
sync_with_kafka = BooleanField(default=False)
correlation_id = StringField(
default=''.join(random.choice(string.ascii_uppercase + string.digits) for _ in range(10))
)
commands_output = DynamicField(default=None)
@classmethod
def post_save(cls, sender, document, **kwargs):
"""
Send data to Kafka executor data topic after a new instance has been saved
:param sender: the sender who emitted the signal
:param document: the saved instance
"""
if kwargs['created']:
CommandHandler(document).send_command()
class CommandHandler:
"""
Command handler class
"""
def __init__(self, command_instance):
self.command_instance = command_instance
def send_command(self):
"""
Send command to Kafka queue and save the response in the
local database
:return: True if message is published over Kafka channel
False otherwise
"""
headers = {
"Content-Type": "application/vnd.kafka.json.v2+json",
"Accept": "application/vnd.kafka.v2+json"
}
logger_kafka_handlers.info(
"Got new command: %s - %s" % (self.command_instance.name, self.command_instance.args))
args = self.command_instance.args
if 'machine_identifier' in args:
args['machine_identifier'] = MACHINE_MAPPING.get(args['machine_identifier'], args['machine_identifier'])
response = requests.post(
KAFKA_BROKER_EXECUTOR_COMMANDS_IN['host'],
json={"records": [{"value": {
"name": self.command_instance.name,
"args": args,
"correlation_id": self.command_instance.correlation_id,
"issued_ts": time.time()
}}]},
headers=headers,
auth=(KAFKA_BROKER_EXECUTOR_COMMANDS_IN['user'], KAFKA_BROKER_EXECUTOR_COMMANDS_IN['password'])
)
self.command_instance.sync_with_kafka = True if response.status_code == 200 else False
self.command_instance.save()
logger_kafka_handlers.info(
"Handled new command; Name: %s - Args: %s - Sync with Kafka: %s; CorrelationId: %s" % (
self.command_instance.name, self.command_instance.args, self.command_instance.sync_with_kafka,
self.command_instance.correlation_id))
所以我希望创建的文档将有 10 个随机字母 correlation_id 并传递给 post_save 基本上执行 HTTP 请求并记录实例字段的处理程序。
问题与 correlation_id 字段相关:
似乎分配给每个保存实例的默认值等于数据库中保存的另一个实例。
我排除了幕后更新查询以及一些变量重新分配,因为在 send_command[=27= 的最后一行记录实例字段时,问题很明显] 方法。
想法?
谢谢,
FB
问题在于您对 default
值的理解。
我不确定 mongo DynamicDocument,但我认为它的行为与普通模型相同。
所以,
来自文档:
The default value for the field. This can be a value or a callable
object. If callable it will be called every time a new object is
created.
在您的情况下,它是不可调用的,因此在创建模型 class 时仅调用一次。
您需要使其可调用,因此将实现移至函数:
def generate_random_corr():
return ''.join(random.choice(string.ascii_uppercase + string.digits) for _ in range(10))
并在模型 class 中使用它,如下所示:
correlation_id = StringField(default=generate_random_corr)
同样适用于其他领域:
issued_at = LongField(default=time.time())
所有对象的时间都相同。
当我尝试在 MongoEngine 中保存 DynamicDocument 时,我试图调试一个奇怪的行为。 文档class声明如下:
class Command(DynamicDocument):
meta = {
'collection': 'executor_data_commands'
}
name = StringField()
args = DynamicField()
issued_at = LongField(default=time.time())
sync_with_kafka = BooleanField(default=False)
correlation_id = StringField(
default=''.join(random.choice(string.ascii_uppercase + string.digits) for _ in range(10))
)
commands_output = DynamicField(default=None)
@classmethod
def post_save(cls, sender, document, **kwargs):
"""
Send data to Kafka executor data topic after a new instance has been saved
:param sender: the sender who emitted the signal
:param document: the saved instance
"""
if kwargs['created']:
CommandHandler(document).send_command()
class CommandHandler:
"""
Command handler class
"""
def __init__(self, command_instance):
self.command_instance = command_instance
def send_command(self):
"""
Send command to Kafka queue and save the response in the
local database
:return: True if message is published over Kafka channel
False otherwise
"""
headers = {
"Content-Type": "application/vnd.kafka.json.v2+json",
"Accept": "application/vnd.kafka.v2+json"
}
logger_kafka_handlers.info(
"Got new command: %s - %s" % (self.command_instance.name, self.command_instance.args))
args = self.command_instance.args
if 'machine_identifier' in args:
args['machine_identifier'] = MACHINE_MAPPING.get(args['machine_identifier'], args['machine_identifier'])
response = requests.post(
KAFKA_BROKER_EXECUTOR_COMMANDS_IN['host'],
json={"records": [{"value": {
"name": self.command_instance.name,
"args": args,
"correlation_id": self.command_instance.correlation_id,
"issued_ts": time.time()
}}]},
headers=headers,
auth=(KAFKA_BROKER_EXECUTOR_COMMANDS_IN['user'], KAFKA_BROKER_EXECUTOR_COMMANDS_IN['password'])
)
self.command_instance.sync_with_kafka = True if response.status_code == 200 else False
self.command_instance.save()
logger_kafka_handlers.info(
"Handled new command; Name: %s - Args: %s - Sync with Kafka: %s; CorrelationId: %s" % (
self.command_instance.name, self.command_instance.args, self.command_instance.sync_with_kafka,
self.command_instance.correlation_id))
所以我希望创建的文档将有 10 个随机字母 correlation_id 并传递给 post_save 基本上执行 HTTP 请求并记录实例字段的处理程序。
问题与 correlation_id 字段相关: 似乎分配给每个保存实例的默认值等于数据库中保存的另一个实例。
我排除了幕后更新查询以及一些变量重新分配,因为在 send_command[=27= 的最后一行记录实例字段时,问题很明显] 方法。
想法?
谢谢, FB
问题在于您对 default
值的理解。
我不确定 mongo DynamicDocument,但我认为它的行为与普通模型相同。
所以, 来自文档:
The default value for the field. This can be a value or a callable object. If callable it will be called every time a new object is created.
在您的情况下,它是不可调用的,因此在创建模型 class 时仅调用一次。
您需要使其可调用,因此将实现移至函数:
def generate_random_corr():
return ''.join(random.choice(string.ascii_uppercase + string.digits) for _ in range(10))
并在模型 class 中使用它,如下所示:
correlation_id = StringField(default=generate_random_corr)
同样适用于其他领域:
issued_at = LongField(default=time.time())
所有对象的时间都相同。