标签: django-orm

如何用django ORM模仿Python集?

我正在申请会员申请.我想提出会员提醒.(成员在一段时间内不是另一段时间的成员).

目前,我正在使用set这个计算.请参阅下面的代码.

class Member(models.Model):
     ...

class Membership(models.Model):
    member = models.ForeignKey(Member, verbose_name=_("Member"))
    start_date = models.DateField(_("Start date"))
    end_date = models.DateField(_("End date"))

x = Member.objects.filter(Q(membership__start_date__lte=dt1) & Q(membership__end_date__gte=dt1))
y = Member.objects.filter(Q(membership__start_date__lte=dt2) & Q(membership__end_date__gte=dt2))
result = set(x) - set(y)
Run Code Online (Sandbox Code Playgroud)

我想知道我只能通过使用django ORM(filter,exclude,annotate,distinct ...)来做到这一点?

在此先感谢您的帮助

UPDATE

事实上,我的模型有点复杂.我也有报纸外键.

class Member(models.Model):
     ...

class Newspaper(models.Model):
     ...

class Membership(models.Model):
    member = models.ForeignKey(Member, verbose_name=_("Member"))
    start_date = models.DateField(_("Start date"))
    end_date = models.DateField(_("End date"))
    newspaper = models.ForeignKey(Newspaper)
Run Code Online (Sandbox Code Playgroud)

我希望得到一份特定报纸的提醒.在这种情况下,工作查询是

sin = models.Membership.objects.filter(start_date__lte=dt1,
                                               end_date__gte=dt1,
                                               newspaper__id=2)

sout = models.Membership.objects.filter(start_date__lte=dt2,
                                          end_date__gte=dt2,
                                          newspaper__id=2)
result = models.Member.objects.filter(membership__in=sin).exclude(membership__in=sout)
Run Code Online (Sandbox Code Playgroud)

我认为这是一个更详细的答案给出了Ghislain …

python django django-orm

1
推荐指数
1
解决办法
151
查看次数

在Django中自动递增模型字段的值

我想问一个问题,我怎么能在django中增加一个模型字段.假设我有一个名为的模型

我的书签(请求):

  url=models.URLField()
  popularity=models.IntegerField()
Run Code Online (Sandbox Code Playgroud)

然后通过使用Django模板我有

bookmarks.html

{%for list_tagg%}中的数据库

网址:{{database.url}}

热门:{{database.popularity}}

{%endfor%}

现在:如果有人点击链接(即bookmarks.html页面中的URL字段),我希望人气应该增加1.我怎么能这样做?有帮助吗?

django django-models django-orm

1
推荐指数
1
解决办法
863
查看次数

Django:在list_display中显示ManyToManyField和Generic Relation

我正在尝试使用list_display访问管理员中的字段.根据文档:(https://docs.djangoproject.com/en/dev/ref/contrib/admin/#django.contrib.admin.ModelAdmin.list_display),不支持ManyToManyFields.我通过创建这样的自定义方法来解决这个问题:

#models.py
class Gig
    musician = models.ManyToManyField(Musician)
    note = models.CharField(max_length=20)

    def __unicode__(self):
        return u'%s' % (self.note)

    def gig_musicians(self):
        return self.musician.all()

#admin.py
class GigAdmin
    list_display = ('note', 'gig_musicians')
Run Code Online (Sandbox Code Playgroud)

这给了我正在寻找的结果,但它非常难看(这也适用于通用关系).结果如下:

    [<Musician: Richard Bona>, <Musician: Bobby Mcerrin>]
Run Code Online (Sandbox Code Playgroud)

我认为这是因为我如何构建方法.你对如何使这更优雅,即只是名字有任何建议吗?

我尝试了其他解决方案,例如, django显示了很多地方的内容,但我无法让它为我工作(它只显示无)

django admin django-orm

1
推荐指数
1
解决办法
2492
查看次数

从查询集中删除(过滤掉)对象

我想从我的查询集中删除 3 个对象。这在额外列表的帮助下工作,但我很确定应该有更好的方法来使用QuerySet API来做到这一点。但是我还没有弄清楚如何:

我在做什么:

ranks = Rank.objects.all()
remove_ranks = ['Field Marshall', 'Military Attache', 'Mercenary Recruiter']
new_ranks =[]

for rank in ranks:
    if not rank.name in remove_ranks:
        new_ranks.append(rank)
Run Code Online (Sandbox Code Playgroud)

我如何使用 Django API 做到这一点?

django django-orm

1
推荐指数
1
解决办法
2188
查看次数

Django ManyToMany 默认所有值

我有以下模型:

class Product(models.Model):
    provinces = models.ManyToManyField('Province', related_name='formats')
Run Code Online (Sandbox Code Playgroud)

默认情况下,产品可以在每个省销售。如何定义模型“产品”,以便默认情况下创建的每个产品都包含所有省份?

谢谢!

python django django-orm

1
推荐指数
1
解决办法
6138
查看次数

Django将字段值注释为queryset

我想将字段值(id)附加到如下所示的QS,但是Django抛出“ str”对象没有属性“ lookup”错误。

Book.objects.all().annotate(some_id='somerelation__id')
Run Code Online (Sandbox Code Playgroud)

看来我可以使用Sum()获得我的id值

Book.objects.all().annotate(something=Sum('somerelation__id'))
Run Code Online (Sandbox Code Playgroud)

我想知道没有办法简单地将原始字段值注释为QS吗?在这种情况下使用sum()感觉不对。

django django-orm

1
推荐指数
1
解决办法
4393
查看次数

我需要使用django ORM的最小文件

我有python模块做一些东西,我需要在数据库中保存一些项目.

Currenlt我正在使用原始sql来插入数据.但我想使用django ORM.

我不需要任何网址,视图等我想要的只是我可以创建模型然后应该能够保存它

user.save()

现在我不想在那里有不必要的文件和数据.但我不确定我需要哪些文件.我需要

settings.py
urls.py
views.py
app folder.
Run Code Online (Sandbox Code Playgroud)

是否有可能只是models.py在设置中DATABASE config.

我是否也需要创建一个应用程序

python django django-orm

1
推荐指数
1
解决办法
853
查看次数

无法散列的类型:尝试在Django中使用post_save动态添加m2m关系时出现“列表”错误

我的内容模型与标签模型具有多对多关系。保存Content对象时,我想动态添加关系。我按照以下方式进行操作。

def tag_content(obj):
    obj.tags.add([1,2,3])
    obj.is_tagged = True
    obj.save()
    return obj

class Tag(models.Model):
    name = models.CharField(max_length=255)

class Content(models.Model):
    title = models.CharField(max_length=255)
    is_tagged = models.BooleanField(default=False)
    tags = models.ManyToManyField(Tag, blank=True)

    def save(self, *args, **kwargs):
        super(Content, self).save(*args, **kwargs)

@receiver(post_save, sender = Content)
def update_m2m_relationships_on_save(sender, **kwargs):
    if not kwargs['instance'].is_tagged:
        tag_content(kwargs['instance'])
Run Code Online (Sandbox Code Playgroud)

基本上,当保存Content对象时,将使用接收方来调用post_save方法,该方法又调用tag_content方法来添加m2m关系。但是,我收到此错误:

TypeError
unhashable type: 'list'
Run Code Online (Sandbox Code Playgroud)

它专门引用.add()函数。知道为什么我会收到此错误吗?任何帮助表示赞赏。另外,请注意我在数据库中有ID为1、2和3的Tag对象。

编辑

好了,我将tag_content更改为以下内容:

def tag_content(obj):
    for tag in Tag.objects.all():
        print tag
        obj.tags.add(tag)
Run Code Online (Sandbox Code Playgroud)

这是因为add()方法接受对象实例,而不接受ID。但是,它仍然不起作用:/我没有收到任何错误,但是关系没有建立。

这特别奇怪,因为print tag命令可以工作并打印出标签。换句话说,该函数正在被调用。有什么帮助吗?顺便说一句,我正在运行Django 1.9.8。

django many-to-many django-models django-orm

1
推荐指数
1
解决办法
539
查看次数

django如何在pre_save功能中获取旧值和新值

我有一个模型A,其中有一个名为的字段name。如何获取pre_save信号中的先前值和新值?

@receiver(pre_save, sender=A)
def signal_product_manage_latest_version_id(
        sender, instance, update_fields=None, **kwargs):
    if 'name' in update_fields:
        print(instance.name)
Run Code Online (Sandbox Code Playgroud)

name当我调用以下代码时,是旧值还是新值?

a = A.objects.create(name="John")
a.name = "Lee"
a.save()
Run Code Online (Sandbox Code Playgroud)

django django-signals django-orm

1
推荐指数
1
解决办法
1365
查看次数

如何在有条件的情况下删除obj

我的模特

class User(models.Model):
    name = models.CharField(max_length=50)
    surname = models.CharField(max_length=50)


class Phone(models.Model):
    user = models.ForeignKey(Osoba, editable=False, related_name='phone', on_delete=models.CASCADE)
    phone = models.CharField(max_length=50)

class Email(models.Model):
    user = models.ForeignKey(Osoba, editable=False, related_name='email', on_delete=models.CASCADE)
    email = models.EmailField()


Run Code Online (Sandbox Code Playgroud)

我希望只有在他的字段中没有值时才可以删除该对象

def delete_user(request, id):
    user = User.objects.get(id=id)

    if not user.email or user.phone:
        if request.method == 'POST':
            user.delete()
            print(user.email)
            return redirect('list_users')


    return render(request,'index-delete.html', {'user': user})
Run Code Online (Sandbox Code Playgroud)

我试过了但是没用

python django django-orm

1
推荐指数
1
解决办法
58
查看次数