Django在预取的过滤相关模型上进行注释

时间:2016-09-06 17:30:27

标签: django prefetch

我有一个用户模型,每个用户可以通过此关联获得许多帖子:

class Post(models.Model):
    ...
    user = models.ForeignKey('User', related_name='posts')

,每个帖子都有一个like_count(整数字段),我希望得到的用户(沿着他们的帖子)有更多的帖子,这些帖子多被m次,我这样做:

User.objects.prefetch_related(Prefetch('posts', queryset=Post.objects.filter(like_count__gte=m), to_attr='top_posts')).annotate(top_post_count=Count('top_posts')).filter(top_post_count__gte=n)

但是,我明白了:

Traceback (most recent call last):
  File "<console>", line 1, in <module>
  File "/usr/local/lib/python3.4/dist-packages/django/db/models/query.py", line 912, in annotate
    clone.query.add_annotation(annotation, alias, is_summary=False)
  File "/usr/local/lib/python3.4/dist-packages/django/db/models/sql/query.py", line 971, in add_annotation
    summarize=is_summary)
  File "/usr/local/lib/python3.4/dist-packages/django/db/models/aggregates.py", line 19, in resolve_expression
    c = super(Aggregate, self).resolve_expression(query, allow_joins, reuse, summarize)
  File "/usr/local/lib/python3.4/dist-packages/django/db/models/expressions.py", line 513, in resolve_expression
    c.source_expressions[pos] = arg.resolve_expression(query, allow_joins, reuse, summarize, for_save)
  File "/usr/local/lib/python3.4/dist-packages/django/db/models/expressions.py", line 463, in resolve_expression
    return query.resolve_ref(self.name, allow_joins, reuse, summarize)
  File "/usr/local/lib/python3.4/dist-packages/django/db/models/sql/query.py", line 1462, in resolve_ref
    self.get_initial_alias(), reuse)
  File "/usr/local/lib/python3.4/dist-packages/django/db/models/sql/query.py", line 1402, in setup_joins
    names, opts, allow_many, fail_on_missing=True)
  File "/usr/local/lib/python3.4/dist-packages/django/db/models/sql/query.py", line 1327, in names_to_path
    "Choices are: %s" % (name, ", ".join(available)))
django.core.exceptions.FieldError: Cannot resolve keyword 'top_posts' into field. Choices are: ...

1 个答案:

答案 0 :(得分:1)

docs解释它被分配给QuerySet项目中根据function hasUserMedia(){ navigator.getUserMedia = navigator.getUserMedia || navigator.webkitGetUserMedia || navigator.mozGetUserMedia || navigator.msGetUserMedia; return !!navigator.getUserMedia; } function hasRTCPeerConnection() { window.RTCPeerConnection = window.RTCPeerConnection || window.webkitRTCPeerConnection || window.mozRTCPeerConnection; return !!window.RTCPeerConnection; } //This function will create our RTCPeerConnection objects, set up the SDP offer and response, and find the ICE candidates for both peers. page 48 function startPeerConnection(stream) { var configuration = { // Uncomment this code to add custom iceServers "iceServers": [{ "url": "stun:stun.1.google.com:19302" }] }; yourConnection = new webkitRTCPeerConnection(configuration); theirConnection = new webkitRTCPeerConnection(configuration); // Setup stream listening yourConnection.addStream(stream); theirConnection.onaddstream = function (e) { theirVideo.src = window.URL.createObjectURL(e.stream); }; // Setup ice handling yourConnection.onicecandidate = function (event) { if (event.candidate){ theirConnection.addIceCandidate(new RTCIceCandidate(event.candidate)); } }; theirConnection.onicecandidate = function (event) { if (event.candidate) { yourConnection.addIceCandidate(new RTCIceCandidate(event.candidate)); } }; // Begin the offer yourConnection.createOffer(function (offer) { yourConnection.setLocalDescription(offer); theirConnection.setRemoteDescription(offer); theirConnection.createAnswer(function (offer) { theirConnection.setLocalDescription(offer); yourConnection.setRemoteDescription(offer); }); }); } var yourVideo = document.querySelector("#yours"), theirVideo = document.querySelector("#theirs"), yourConnection, theirConnection; if (hasUserMedia()) { navigator.getUserMedia({ video: true, audio: false }, function (stream) { yourVideo.src = window.URL.createObjectURL(stream); if (hasRTCPeerConnection()) { startPeerConnection(stream); } else { alert("Sorry, your browser does not support WebRTC."); } }, function (error) { console.log(error); } ); } else { alert("Sorry, your browser does not support WebRTC."); } 参数命名的属性。

我认为这并不意味着它可以作为模型字段访问,后续注释可以链接到该模型字段。

您可能需要将其分为两个步骤。

修改:该问题已评论说过滤器可以链接但注释不能。