рдПрдХ рдЫреЛрдЯреА рд╕реА рдкрд░рд┐рдпреЛрдЬрдирд╛ рдХреЗ рдкреНрд░рджрд░реНрд╢рди рдХреЛ рдбреАрдмрдЧ рдХрд░рддреЗ рд╣реБрдП, рд▓реЗрдХрд┐рди рдПрдХ рдмрдбрд╝реЗ рдЖрдзрд╛рд░ рдХреЗ рд╕рд╛рде, рдореИрдВ рдПрдХ рдЕрдкреНрд░рд┐рдп рд╡рд┐рд╢реЗрд╖ рдкреНрд░рднрд╛рд╡ рдореЗрдВ рднрд╛рдЧ рдЧрдпрд╛ред
Django, рдЬрдм NULL рдХреЗ рд▓рд┐рдП рдЬрд╛рдБрдЪ рд╕реЗ рдЬреБрдбрд╝реА рд╡рд┐рджреЗрд╢реА рдХреБрдВрдЬрд┐рдпреЛрдВ рдХреЗ рд▓рд┐рдП рд╢рд░реНрддреЛрдВ рдХреЗ рд╕рд╛рде рд▓рд╛ рд░рд╣рд╛ рд╣реИ, рдРрд╕реА рдкреНрд░рддреНрдпреЗрдХ рдХреБрдВрдЬреА рдХреЗ рд▓рд┐рдП JOIN рдпреБрдХреНрдд рдХреНрд╡реЗрд░реАрдЬрд╝ рдЙрддреНрдкрдиреНрди рдХрд░рддрд╛ рд╣реИред
рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдПрдХ рдореЙрдбрд▓ рдХреЗ рд▓рд┐рдП
class ForumPlugin(models.Model): name = models.CharField( null=False, blank=False, max_length=50, unique=True, verbose_name=_('name') ) class Thread(MPTTModel): parent = TreeForeignKey( 'self', null=True, blank=True, related_name='children', verbose_name=_('parent thread') ) plugin = models.ForeignKey( ForumPlugin, null=True, blank=True, related_name='threads', verbose_name=_('plugin') )
рдЬрдм рд▓рд╛рдиреЗ
Thread.objects.filter(plugin__isnull=True, parent__isnull=True)
Djando рдЗрд╕ рдЕрдиреБрд░реЛрдз рдХреЛ рдЙрддреНрдкрдиреНрди рдХрд░рддрд╛ рд╣реИ:
SELECT `forum_thread`.`id`, `forum_thread`.`parent_id`, `forum_thread`.`plugin_id`, `forum_thread`.`lft`, `forum_thread`.`rght`, `forum_thread`.`tree_id`, `forum_thread`.`level` FROM `forum_thread` LEFT OUTER JOIN `forum_thread` T2 ON (`forum_thread`.`parent_id` = T2.`id`) LEFT OUTER JOIN `forum_forumplugin` ON (`forum_thread`.`plugin_id` = `forum_forumplugin`.`id`) WHERE (T2.`id` IS NULL AND `forum_forumplugin`.`id` IS NULL AND ) ORDER BY `forum_thread`.`id
рд╕реНрд╡рд╛рднрд╛рд╡рд┐рдХ рд░реВрдк рд╕реЗ, рдЗрд╕ рддрд░рд╣ рдХреЗ рдЕрдиреБрд░реЛрдз рдХрд╛ рдирд┐рд╖реНрдкрд╛рджрди рд╕рдордп рдкрд░рд┐рдорд╛рдг рдХреЗ рдХрдИ рдЖрджреЗрд╢реЛрдВ рджреНрд╡рд╛рд░рд╛ рдмрдврд╝рд╛рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рдЬреЛ рдмрдбрд╝реА рддрд╛рд▓рд┐рдХрд╛рдУрдВ рдХреЗ рд╕рд╛рде рдорд╣рддреНрд╡рдкреВрд░реНрдг рд╣реЛ рд╕рдХрддрд╛ рд╣реИред рддреЛ рдореЗрд░реА рдкрд░рд┐рдпреЛрдЬрдирд╛ рдкрд░, 20-30k рд░рд┐рдХреЙрд░реНрдб рдХреЗ рдЖрджреЗрд╢ рдХреА рдПрдХ рдореЗрдЬ рдкрд░, рдЗрд╕ рддрд░рд╣ рдХреЗ рдЪрдпрди рдХреЛ 1ms рдХреЗ рдмрдЬрд╛рдп 100ms рд╕реЗ 300ms рддрдХ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рдЬреЛ рдкреЗрдЬ рдкреАрдврд╝реА рдХреЗ рд╕рдордп рдХреЛ рдЖрдзреЗ рд╕реЗ рдмрдврд╝рд╛рддрд╛ рд╣реИред
рджреБрд░реНрднрд╛рдЧреНрдп рд╕реЗ, рдУрдЖрд░рдПрдо рдбреЗрд╡рд▓рдкрд░реНрд╕ рдиреЗ рдмрдЧ рдХреЛ рдЪрд╛рд░ рд╕рд╛рд▓ рд╕реЗ рдЬрд╛рдирд╛ рд╣реИ рдФрд░ рдЗрд╕рдХрд╛
рд▓рдВрдмрд╛ рдФрд░ рджреБрдЦрдж рдЗрддрд┐рд╣рд╛рд╕ рд╣реИ ред
рд╡рд░реНрддрдорд╛рди рдореЗрдВ 1.4.3 рд╕рд╣рд┐рдд рд╕рднреА рд╕реНрдерд┐рд░ рд╕рдВрд╕реНрдХрд░рдгреЛрдВ рдореЗрдВ рдореМрдЬреВрдж рд╣реИред рдпрд╣ рдорд╛рдирд╛ рдЬрд╛рддрд╛ рд╣реИ рдХрд┐ 1.5 рдореЗрдВ рдпрд╣ рдЕрдВрддрддрдГ рддрдп рд╣реЛ рдЬрд╛рдПрдЧрд╛ред
рд╡рд░реНрдХрдЕрд░рд╛рдЙрдВрдб рдХреЗ рд░реВрдк рдореЗрдВ, рдЗрд╕реЗ рджреЛрд╣рд░реЗ рдирдХрд╛рд░ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреА рд╕рд▓рд╛рд╣ рджреА рдЬрд╛рддреА рд╣реИ:
Thread.objects.exclude(plugin__isnull=False, parent__isnull=False)
рд▓реЗрдХрд┐рди рдореИрдВрдиреЗ рдЕрднреНрдпрд╛рд╕ рдореЗрдВ рдЗрд╕ рддрд░рд╣ рд╕реЗ рд╕рдорд╕реНрдпрд╛ рд╕реЗ рдЫреБрдЯрдХрд╛рд░рд╛ рдкрд╛рдиреЗ рдХрд╛ рдкреНрд░рдмрдВрдзрди рдирд╣реАрдВ рдХрд┐рдпрд╛ред рд╕реАрдзреЗ рдкреИрд░реЗрдВрдЯ_рдб рдлрд╝реАрд▓реНрдб рдкрд░ рдкрд╣реБрдБрдЪрдиреЗ рд╕реЗ рднреА рдорджрдж рдирд╣реАрдВ рдорд┐рд▓рддреА рд╣реИред
рдореЙрдбрд▓ рдбрд┐рдЬрд╛рдЗрди рдХрд░рддреЗ рд╕рдордп рд╕рд╛рд╡рдзрд╛рди рд░рд╣реЗрдВ рдФрд░ Django рдХреА рдЗрд╕ рд╡рд┐рд╢реЗрд╖рддрд╛ рдХреЛ рдзреНрдпрд╛рди рдореЗрдВ рд░рдЦреЗрдВ, рдФрд░ NULL рд╢рд░реНрддреЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рд╡рд┐рджреЗрд╢реА рдХреБрдВрдЬрд┐рдпреЛрдВ рдХреЛ рд▓рд╛рдиреЗ рд╕реЗ рдмрдЪреЗрдВред
UPD: рдПрдХ рд╕рдорд╛рдзрд╛рди рдорд┐рд▓рд╛:
Category.objects.extra(where=['parent_id IS NULL'])
рдХрдЪреНрдЪреЗ sql рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рдирд┐рд╢реНрдЪрд┐рдд рд░реВрдк рд╕реЗ рдЦрд░рд╛рдм рд╣реИ, рд▓реЗрдХрд┐рди рдЬрд╛рд╣рд┐рд░ рд╣реИ рдХрд┐ рдпрд╣ рдПрдХрдорд╛рддреНрд░ рд╕рдорд╛рдзрд╛рди рд╣реИред