1

RELATED フィールドを返すようにこのクエリを変更したいと思います。

msgs = my_unit.messages_in_the_queue.all().select_related("message_content__description")

でも、

>>> msgs.values()[0]
{... 'message_type_id': 31, 'object_id': 4, ...} # <--where is the "description"??

>>> msgs.values("message_content__description")[0]
FieldError: Cannot resolve keyword 'message_content__description' into field. Choices are: acknowledged_time, id, message_type, object_id, sent_time, destination

これまでのところ、私が見つけた唯一の解決策は、これを手動で使用することでした:

for queued_message in MyUnit.messages_in_the_queue.all().select_related():
    do_something_with(queued_message.message_content.description)

ただし、これは QuerySet ではないため、ページング可能ではありません -目的の関連フィールドを返すページング可能なクエリにする方法はありますか?

モデルは次のとおりです。

class MessageQueueModel(models.Model):
    destination = models.ForeignKey(MyUnit, related_name="messages_in_the_queue")
    sent_time = models.DateTimeField(default=None, null=True, blank=True)
    acknowledged_time = models.DateTimeField(default=None, null=True, blank=True)

    #the message:
    message_type = models.ForeignKey(ContentType, null=True, blank=True)
    object_id = models.PositiveIntegerField(null=True, blank=True)
    message_content = generic.GenericForeignKey('message_type', 'object_id')


class CommandModel(models.Model):
    description = models.CharField(max_length=100)
    command_xml = models.TextField()

どんな助けでも大歓迎です!

4

1 に答える 1

0

それはどのようにselect_related機能するかではありません。特定のフィールドを追加するように求めることはできません。関係だけです。

values()結合されたフィールドを値のリストに追加する場合は、フィールドのリストでそれを要求する必要があります。

最後に、一般的な関係がどのように機能するかということでもありません。一般的なリレーションは実際には外部キーではないため、結合することはできません。

ただし、どちらも、元のクエリセットの何が問題なのかわかりません。実際に「ページング」したいものは何ですか?また、元々取得したクエリセットが適切でないのはなぜですか? (そしてもちろん、なぜ通常のリストを改ページできないと思いますか?)

于 2013-01-23T11:36:00.100 に答える