lookup_field在ListAPIView上不起作用

时间:2018-06-25 20:13:15

标签: django django-rest-framework lookup-field

我正在创建Reddit克隆。

models.py

process_id

urls.py

process_event

ListPostsOfReddit

status

我的URL名为“ reddit-posts”有问题。该URL尝试获取其#0 /var/www/html/blue/lib/Varien/Db/Statement/Pdo/Mysql.php(110): Zend_Db_Statement_Pdo->_execute(Array) #1 /var/www/html/blue/app/code/core/Zend/Db/Statement.php(291): Varien_Db_Statement_Pdo_Mysql->_execute(Array) #2 /var/www/html/blue/lib/Zend/Db/Adapter/Abstract.php(480): Zend_Db_Statement->execute(Array) #3 /var/www/html/blue/lib/Zend/Db/Adapter/Pdo/Abstract.php(238): Zend_Db_Adapter_Abstract->query('SELECT `main_ta...', Array) #4 /var/www/html/blue/lib/Varien/Db/Adapter/Pdo/Mysql.php(504): Zend_Db_Adapter_Pdo_Abstract->query('SELECT `main_ta...', Array) #5 /var/www/html/blue/lib/Zend/Db/Adapter/Abstract.php(737): Varien_Db_Adapter_Pdo_Mysql->query('SELECT `main_ta...', Array) #6 /var/www/html/blue/lib/Varien/Data/Collection/Db.php(740): Zend_Db_Adapter_Abstract->fetchAll('SELECT `main_ta...', Array) #7 /var/www/html/blue/app/code/core/Mage/Core/Model/Resource/Db/Collection/Abstract.php(521): Varien_Data_Collection_Db->_fetchAll('SELECT `main_ta...', Array) #8 /var/www/html/blue/lib/Varien/Data/Collection/Db.php(572): Mage_Core_Model_Resource_Db_Collection_Abstract->getData() #9 /var/www/html/blue/lib/Varien/Data/Collection.php(752): Varien_Data_Collection_Db->load() #10 /var/www/html/blue/app/code/core/Mage/Index/Block/Adminhtml/Process/Grid.php(84): Varien_Data_Collection->count() #11 /var/www/html/blue/app/code/core/Mage/Adminhtml/Block/Widget/Grid.php(551): Mage_Index_Block_Adminhtml_Process_Grid->_afterLoadCollection() #12 /var/www/html/blue/app/code/core/Mage/Index/Block/Adminhtml/Process/Grid.php(64): Mage_Adminhtml_Block_Widget_Grid->_prepareCollection() #13 /var/www/html/blue/app/code/core/Mage/Adminhtml/Block/Widget/Grid.php(643): Mage_Index_Block_Adminhtml_Process_Grid->_prepareCollection() #14 /var/www/html/blue/app/code/core/Mage/Adminhtml/Block/Widget/Grid.php(649): Mage_Adminhtml_Block_Widget_Grid->_prepareGrid() #15 /var/www/html/blue/app/code/core/Mage/Core/Block/Abstract.php(922): Mage_Adminhtml_Block_Widget_Grid->_beforeToHtml() #16 /var/www/html/blue/app/code/core/Mage/Core/Block/Abstract.php(641): Mage_Core_Block_Abstract->toHtml() #17 /var/www/html/blue/app/code/core/Mage/Core/Block/Abstract.php(585): Mage_Core_Block_Abstract->_getChildHtml('grid', true) #18 /var/www/html/blue/app/code/core/Mage/Adminhtml/Block/Widget/Grid/Container.php(77): Mage_Core_Block_Abstract->getChildHtml('grid') #19 /var/www/html/blue/app/design/adminhtml/default/default/template/widget/grid/container.phtml(36): Mage_Adminhtml_Block_Widget_Grid_Container->getGridHtml() #20 /var/www/html/blue/app/code/core/Mage/Core/Block/Template.php(241): include('/var/www/html/b...') #21 /var/www/html/blue/app/code/core/Mage/Core/Block/Template.php(272): Mage_Core_Block_Template->fetchView('adminhtml/defau...') #22 /var/www/html/blue/app/code/core/Mage/Core/Block/Template.php(286): Mage_Core_Block_Template->renderView() #23 /var/www/html/blue/app/code/core/Mage/Adminhtml/Block/Template.php(81): Mage_Core_Block_Template->_toHtml() #24 /var/www/html/blue/app/code/core/Mage/Adminhtml/Block/Widget/Container.php(308): Mage_Adminhtml_Block_Template->_toHtml() #25 /var/www/html/blue/app/code/core/Mage/Core/Block/Abstract.php(923): Mage_Adminhtml_Block_Widget_Container->_toHtml() #26 /var/www/html/blue/app/code/core/Mage/Core/Block/Text/List.php(43): Mage_Core_Block_Abstract->toHtml() #27 /var/www/html/blue/app/code/core/Mage/Core/Block/Abstract.php(923): Mage_Core_Block_Text_List->_toHtml() #28 /var/www/html/blue/app/code/core/Mage/Core/Block/Abstract.php(641): Mage_Core_Block_Abstract->toHtml() #29 /var/www/html/blue/app/code/core/Mage/Core/Block/Abstract.php(585): Mage_Core_Block_Abstract->_getChildHtml('content', true) #30 /var/www/html/blue/app/design/adminhtml/default/default/template/page.phtml(74): Mage_Core_Block_Abstract->getChildHtml('content') #31 /var/www/html/blue/app/code/core/Mage/Core/Block/Template.php(241): include('/var/www/html/b...') #32 /var/www/html/blue/app/code/core/Mage/Core/Block/Template.php(272): Mage_Core_Block_Template->fetchView('adminhtml/defau...') #33 /var/www/html/blue/app/code/core/Mage/Core/Block/Template.php(286): Mage_Core_Block_Template->renderView() #34 /var/www/html/blue/app/code/core/Mage/Adminhtml/Block/Template.php(81): Mage_Core_Block_Template->_toHtml() #35 /var/www/html/blue/app/code/core/Mage/Core/Block/Abstract.php(923): Mage_Adminhtml_Block_Template->_toHtml() #36 /var/www/html/blue/app/code/core/Mage/Core/Model/Layout.php(555): Mage_Core_Block_Abstract->toHtml() #37 /var/www/html/blue/app/code/core/Mage/Core/Controller/Varien/Action.php(390): Mage_Core_Model_Layout->getOutput() #38 /var/www/html/blue/app/code/core/Mage/Index/controllers/Adminhtml/ProcessController.php(55): Mage_Core_Controller_Varien_Action->renderLayout() #39 /var/www/html/blue/app/code/core/Mage/Core/Controller/Varien/Action.php(418): Mage_Index_Adminhtml_ProcessController->listAction() #40 /var/www/html/blue/app/code/core/Mage/Core/Controller/Varien/Router/Standard.php(254): Mage_Core_Controller_Varien_Action->dispatch('list') #41 /var/www/html/blue/app/code/core/Mage/Core/Controller/Varien/Front.php(172): Mage_Core_Controller_Varien_Router_Standard->match(Object(Mage_Core_Controller_Request_Http)) #42 /var/www/html/blue/app/code/core/Mage/Core/Model/App.php(365): Mage_Core_Controller_Varien_Front->dispatch() #43 /var/www/html/blue/app/Mage.php(683): Mage_Core_Model_App->run(Array) #44 /var/www/html/blue/index.php(84): Mage::run('', 'store') #45 {main}在URL中指定为class Subreddit(models.Model): owner = models.ForeignKey(Profile, on_delete=models.DO_NOTHING, null=True, blank=True, related_name='subreddits') class Post(models.Model): owner = models.ForeignKey(Profile, on_delete=models.DO_NOTHING) title = models.CharField(max_length=300) subreddit = models.ForeignKey(Subreddit, on_delete=models.CASCADE) 的所有特定子reddit。这里的问题是我正在获取所有帖子,而不是该subreddit的特定帖子。因此,如果我在id = 1的subreddit中有2个帖子,在id = 2的subreddit中有3个帖子,如果我转到urlpatterns = [ # API Views # SUBREDDIT VIEWS path('r/', ListSubreddits.as_view(), name='reddits'), path('r/<int:r_id>/', DetailSubreddit.as_view(), name='reddits-detail'), path('r/<int:r_id>/posts/', ListPostsOfReddit.as_view(), name='reddit-posts'), ] ,从理论上讲,我应该只获得2个帖子,但实际上我将获得所有5个帖子。 我已经指定了class ListPostsOfReddit(ListAPIView): queryset = Post.objects.all() serializer_class = PostSerializer lookup_field = 'subreddit__id' lookup_url_kwarg = 'r_id' id,但这似乎不起作用。需要帮忙!谢谢!

1 个答案:

答案 0 :(得分:3)

显然,docs说您需要为ListAPIView自己编写过滤条件。 另请参见this similar question

在您的情况下,看起来像这样:

class ListPostsOfReddit(ListAPIView):
    serializer_class = PostSerializer

    def get_queryset(self):
        return Post.objects.filter(subreddit__id=self.kwargs['r_id'])

据我了解,docs for the generic API viewslookup_fieldlookup_url_kwarg属性仅用于详细视图,而不用于列表视图。