如何过滤ManyToMany字段中的对象引用?

时间:2016-11-04 19:53:48

标签: python django django-models django-orm

我想列出所有已发布的标签和已发布的帖子,如下所示:

DROP TABLE Date_Dimension CASCADE CONSTRAINTS ;

CREATE TABLE Date_Dimension
  (
    date_key             NUMBER NOT NULL ,
    full_date            DATE ,
    day_of_week          NUMBER ,
    day_num_in_month     NUMBER ,
    day_num_overall      NUMBER ,
    day_name             VARCHAR2 (9) ,
    day_abbrev           VARCHAR2 (3) ,
    week_num_in_year     NUMBER ,
    week_num_overall     NUMBER ,
    week_begin_date      DATE ,
    MONTH                NUMBER ,
    month_number_overall NUMBER ,
    month_name           VARCHAR2 (9) ,
    month_abbrev         VARCHAR2 (3) ,
    quarter              NUMBER ,
    YEAR                 VARCHAR2 (20) ,
    century              NUMBER
  ) ;
ALTER TABLE Date_Dimension ADD CONSTRAINT Date_Dimension_PK PRIMARY KEY ( date_key ) ;

Create or replace PROCEDURE sp_DATE_DIMENSION(v_STARTDATE IN INT, v_END_YEAR IN INT) IS

v_STARTDATE DATE;
v_ENDDATE DATE;

v_STARTDATE Date := to_date('2005/01/01' || v_START_YEAR, 'YYYY/MM/DD');
v_ENDDATE Date := to_date('2020/12/31' || v_END_YEAR,'YYYY/MM/DD');

BEGIN

INSERT INTO

  Date_Dimension 
  (date_key,full_date, day_of_week, day_num_in_month, day_num_overall, day_name, day_abbrev, week_num_in_year, week_num_overall, month, month_name, month_abbrev, quarter, year, century)

VALUES
  (
 '1',TO_DATE(v_STARTDATE, 'yyyy/mm/dd'), TO_NUMBER(v_STARTDATE, 'D'), TO_NUMBER(v_STARTDATE, 'DD'), TO_NUMBER(v_STARTDATE, 'DDD'), TO_CHAR(v_STARTDATE, 'DAY'), TO_CHAR(v_STARDATE, 'DY'), TO_NUMBER(v_STARTDATE, 'IW'), TO_NUMBER(v_STARTDATE, 'WW'), TO_NUMBER(v_STARTDATE, 'MM'), TO_CHAR (v_STARTDATE, 'MONTH'), TO_CHAR (v_STARTDATE, 'MON'), TO_NUMBER (v_STARTDATE, 'Q'), TO_CHAR (v_STARTDATE, 'YEAR'), TO_NUMBER (v_STARTDATE, 'CC') 
  )
;

IF v_STARTDATE > v_ENDDATE THEN

  DBMS_OUTPUT.PUT_LINE ('ERROR IN CODE REGARDING DATES CHOSEN');

ELSE

    WHILE v_STARTDATE <= V_ENDDATE LOOP 
        DBMS_OUTPUT.PUT_LINE ('Date : '||to_char(v_StartDate,'YYYY / MM / DD'));

        v_STARTDATE := v_STARTDATE + 1;

    END LOOP;
END IF;
END;

我有Tag1 ├── first-post └── second-post Tag2 ├── third-post └── fourth-post Tag这样的模型:

Post

我有一个上传处理器,它将标签传递给模板:

class Tag(models.Model):
    name = models.CharField(max_length=16)
    is_published = models.BooleanField(default=True)

class Post(models.Model):
    title = models.CharField(max_length=192)
    tags = models.ManyToManyField(Tag, related_name='posts')    
    is_published = models.BooleanField(default=True)

我在模板中列出了标签和帖子,如下所示:

def tags(request):
    published_tags = Tag.objects\
        .filter(is_published=True)\
        .exclude(posts=None)\
        .order_by('name')
    return {'tags': published_tags}

我可以按{% for tag in tags %} <h1>{{ tag.name }}</h1> {% for post in tag.posts.all %} <li> <a href="{{ post.get_absolute_url }}">{{ post.title }}</a> </li> {% endfor %} {% endfor %} 过滤代码。如何在标记(is_published)中的后向引用中按posts过滤is_published

我不想返回两个名为Tag.posts和`posts'的查询集。

1 个答案:

答案 0 :(得分:1)

我是这样做的:

def tags(request):
    published_tags = Tag.objects\
        .filter(is_published=True, posts__is_published=True)\
        .exclude(posts=None)\
        .order_by('name')\
        .distinct()
    return {'tags': published_tags}

ps:https://en.wikipedia.org/wiki/Rubber_duck_debugging