2015-06-22 3 views
3

Я пытаюсь использовать метод выбора select_related с помощью сериализаторов DRF, , но этот пример по-прежнему выполняет множество запросов sql.select_related queryset с ModelSerializer в каркасе отдыха Django

Как я могу получить связанный объект «model_b» от метода select_related?

class Model_A(models.Model): 
    title = models.CharField(max_length=100) 
    description = models.TextField() 
    model_b = models.ForeignKey(Model_B, null=True, blank=True) 

class Model_B(models.Model): 
    title = models.CharField(max_length=100) 


class Model_A_Serializer(serializers.ModelSerializer): 
    model_b = Model_B_Serializer(source="model_b") 
    class Meta: 
     model = Model_A 
     fields = ('title', 'model_b') 

class Model_B_Serializer(serializers.ModelSerializer): 
    class Meta: 
     model = Model_B 


class Model_A_View(viewsets.ModelViewSet): 
    serializer_class = Model_A_Serializer 
    queryset = Model_A.objects.select_related('model_b').all() 
+0

Там могут быть некоторые проблемы с фактическим кодом, но он должен работать нормально, как написано выше. Мне нужно больше информации. –

+1

Я голосую, чтобы закрыть этот вопрос как вне темы, потому что вы не включили SQL-запросы, которые вы получаете. Основываясь на том, что вы написали, ваш код должен работать нормально. – YPCrumble

ответ

0

Use prefetch_related instead.

queryset = Model_A.objects.all().prefetch_related('model_b') 

Кроме того, вы можете войти ваши SQL запросы к консоли с this answer

+0

prefetch_related не подходит для отношений ManyToMany? –

+1

Я использую его в ForeignKeys, ManyToMany и вывел другие модели 'related_name'. В режиме отладки я распечатываю все свои sql-запросы. Когда я использовал 'prefetch_related', тогда все мои маленькие маленькие одноразовые запросы на другие модели уходили. Он делает только один запрос на связанные модели FK'd с большим количеством идентификаторов. –

+2

'select_related' должен отлично работать в вашей ситуации. Они ведут себя по-другому:' select_related' будет включать model_b в исходный запрос через join, 'prefetch_related' будет запускать отдельный отдельный запрос для model_b, используя' WHERE ... IN() '. –

Смежные вопросы