标签: django-related-manager

Django ManyToMany与"自我"的关系没有落后关系

这里有关于向后关系的几个问题,但我要么太愚蠢了解它们,要么认为它们不适合我的情况.

我有模特儿

class MyModel(models.Model)
    stuff = models.ManyToManyField('self', related_name = 'combined+')
Run Code Online (Sandbox Code Playgroud)

我创建了表单,我将所存储的信息组合在一起.它将对象关系存储在数据库中,如下所示:

表:

id:from_stuff_id:to_stuff_id
1:original_object_id:first_related_object
2:original_object_id:second_related_object
3:first_related_object:original_object_id
4:second_related_object:original_object_id
Run Code Online (Sandbox Code Playgroud)

所以当我显示对象first_related_object并检查与之关系时

myobject.stuff.all()
Run Code Online (Sandbox Code Playgroud)

然后我得到"original_object".但我不需要它.我希望它不会显示出这样的倒退关系.

EDIT1

所以我很难解释自己.

也许这段代码可以更好地说明我想要的东西.

myobjectone = MyModel.objects.get(pk = 1)
myobjecttwo = MyModel.objects.get(pk = 2)
myobjectthree = MyModel.objects.get(pk = 3)
myobjectone.stuff.add(myobjecttwo)
myobjectone.stuff.add(myobjectthree)
myobjectone.stuff.all()
[myobjecttwo, myobjectthree] <-- this i want
myobjecttwo.stuff.all()
[myobjectone]<-- this i do not want
myobjectthree.stuff.all()
[myobjectone]<-- this i do not want
Run Code Online (Sandbox Code Playgroud)

现在唯一的问题是 - 如果我甚至应该使用stuff.all()如果我不想要它们产生的结果并且应该编写我自己的经理/方法来获得排除后向关系的对象列表.

/ EDIT1

edit2回应亨利佛罗伦萨:

好的 - 我用空基测试它看起来像对称= False确实有数据库级别差异.我认为.

我创建了对称= False的空表,然后创建添加关系没有产生向后关系.如果我创建没有symmetrical = False的空表.然后他们是.在创建表之后,设置symmetrical = False没有区别.所以我猜这些差异在于数据库级别.

/ edit2那么我应该在这做什么?

写我自己的经理什么的? …

django orm django-related-manager

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

django rest框架 - 向后序列化以避免prefetch_related

我有两个型号,Item并且ItemGroup:

class ItemGroup(models.Model):
   group_name = models.CharField(max_length=50)
   # fields..

class Item(models.Model):
   item_name = models.CharField(max_length=50)
   item_group = models.ForeignKey(ItemGroup, on_delete=models.CASCADE)
   # other fields..
Run Code Online (Sandbox Code Playgroud)

我想编写一个序列化程序,它将所有项目组及其项目列表作为嵌套数组获取.

所以我想要这个输出:

[ {group_name: "item group name", "items": [... list of items ..] }, ... ]
Run Code Online (Sandbox Code Playgroud)

正如我所见,我应该用django rest框架写这个:

class ItemGroupSerializer(serializers.ModelSerializer):
   class Meta:
      model = ItemGroup
      fields = ('item_set', 'group_name') 
Run Code Online (Sandbox Code Playgroud)

意思是,我必须为ItemGroup(不是Item)编写序列化器.为了避免很多查询,我传递了这个查询集:

ItemGroup.objects.filter(**filters).prefetch_related('item_set')
Run Code Online (Sandbox Code Playgroud)

我看到的问题是,对于大型数据集,会prefetch_related导致带有非常大的sql IN子句的额外查询,我可以避免使用Item对象上的查询:

Item.objects.filter(**filters).select_related('item_group')
Run Code Online (Sandbox Code Playgroud)

这导致JOIN更好.

是否可以查询Item而不是ItemGroup具有相同的序列化输出?

python django django-models django-related-manager django-rest-framework

13
推荐指数
2
解决办法
830
查看次数

Django:如何通过Template通过ForeignKey连接数据?

几个星期后,我正在学习Python和Django.到目前为止,已经足够阅读其他用户的问题和答案.但现在我的第一个问题的时刻已经到来.

我会尽力描述我的问题.我的问题是我无法查询或获取我想要的数据.

我想得到一个类Image的第一个对象的url,它由ForeignKey关联到一个Gallery,它由ForeignKey关联到类Entry.

这里到目前为止models.py:

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

class Gallery(models.Model):
   entry = models.ForeignKey('BlogEntry')

class Image(models.Model):
  gallery = models.ForeignKey('Gallery')
  picture = models.ImageField(upload_to='img')
Run Code Online (Sandbox Code Playgroud)

风景:

def view(request):
  return render_to_response('mainview.html', {
    'entryquery': BlogEntry.objects.all(),
    }
)
Run Code Online (Sandbox Code Playgroud)

模板:

{% for item in entryquery %}
  <h1>{{ item.title }}</h1>
  <img src="{{ item.WHAT TO ENTER HERE? :) }}" />
{% endfor %}
Run Code Online (Sandbox Code Playgroud)

很明显我想要什么?有人可以帮助我,并在可能的时候写一个简短的解释?

问候巴斯蒂安

django templates foreign-keys django-related-manager

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

Django Abstract Models使用下划线设置related_name

我有一个抽象基础模型和2个继承模型,我需要强制related_name采用特定格式.

class Animal(models.Model):
    legs = models.IntegerField(related_name='%(class)s')
    habitat = models.ForeignKey(Habitats, related_name='%(class)s')

class DogAnimal(BaseModel):
    name = models.CharField(max_length=20, related_name='dog_animal')

class CatAnimal(BaseModel):
    name = models.CharField(max_length=20, related_name='cat_animal')
Run Code Online (Sandbox Code Playgroud)

通常,related_name ='%(class)s'将分别导致catanimal和doganimal.

我需要像这样的强调值:dog_animal,cat_animal

以下是"为什么"我需要这样做 - 遗产.这些模型没有使用基类组织 - 因此最初指定的related_name是'dog_animal'和'cat_animal'.改变这将是很多工作.

python django django-models django-related-manager

9
推荐指数
2
解决办法
978
查看次数

在Django中可以使用多对多关系之前,对象需要具有字段"id"的值

我的models.py中有以下代码:

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

class Article(models.Model):
    tags = models.ManyToManyField(Tag)

    def save(self, *args, **kwargs):
        for tag in self.tags:
            print tag.name
        super(Article, self).save(*args, **kwargs)
Run Code Online (Sandbox Code Playgroud)

当我尝试从管理面板创建文章时,我收到以下错误:

ValueError: "<Article>" needs to have a value for field "id" before this many-to-many relationship can be used.
Run Code Online (Sandbox Code Playgroud)

我该如何解决这个问题?我需要保存文章之前访问并迭代标记.谢谢!

python django django-models django-related-manager

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

如何在 Manytomany 字段中使用“包含”?

我有一个模型:

class Tasks(models.Model):
    name = models.CharField(max_length = 50, null = True, blank = True)
    assigned_to = models.ManyToManyField(User, null = True, blank = True)


Run Code Online (Sandbox Code Playgroud)

我必须执行一个查询

tasks_for_myuser = Tasks.objects.filter(assigend_to__contains = myuser)

但这会引发错误。 django.core.exceptions.FieldError: Related Field got invalid lookup: contains

请帮忙!

lookup many-to-many django-models django-related-manager

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

为什么 Django 的 RelatedManager 不会在目标对象上缓存调用查找的对象?

如果我有以下型号:

class Fubar(models.Model):
    name = models.CharField()

class Related(models.Model):
    fubar = models.ForeignKey(Fubar)
Run Code Online (Sandbox Code Playgroud)

如果我使用 .related_set 访问相关对象,我希望 ORM 会神奇地缓存父 Fubar 对象:

fubar = Fubar.objects.all()[0]
related = fubar.related_set.all()[0]
related.fubar
Run Code Online (Sandbox Code Playgroud)

这会产生 3 个查询,我希望它只会产生 2 个查询,因为 related.fubar 可以在此上下文中优化为我在其上调用 RelatedManager 的同一对象。

python django django-orm django-related-manager

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

在Django中,如何使用特定的用户外键获取所有相关对象

我有这样的事情:

class Video(models.Model):
    user = models.ForeignKey(User, related_name='owner')
    ...
Run Code Online (Sandbox Code Playgroud)

并且我正在尝试通过执行以下操作来访问特定用户拥有的所有视频:

u = User.objects.get(pk=1)
u.video_set.all()
Run Code Online (Sandbox Code Playgroud)

我收到错误'用户对象没有属性video_set'

难道我做错了什么?

django django-models django-authentication django-related-manager

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

如何将OneToOneField设置为null?

我有一个可能为null的OneToOneField模型:

solution_for = models.OneToOneField('QNAQuestion', related_name='solution', blank=True, null=True)
Run Code Online (Sandbox Code Playgroud)

有时它有一个值需要在视图中删除.null它的语法是什么?这是一个非常简单的问题,但谷歌并没有真正帮助.

我已经尝试过:

obj.solution_for = None
obj.solution_for = False
obj.solution_for = ''
del obj.solution_for
Run Code Online (Sandbox Code Playgroud)

但我想我必须放弃..这样做的正确方法是什么?

django django-models django-queryset django-related-manager django-1.7

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

django相关经理 - 在模板中

我想显示一个位置的最新评分.我有2张桌子(django型号)

Class Location(models.Model):
   locationname = models.CharField()
   ...

Class Rating(models.Model):
   von_location = models.ForeignKey(Location,related_name="locations_rate")
   rating = models.IntegerField()
Run Code Online (Sandbox Code Playgroud)

现在在我的数据库中,一个位置(id = 1)有3个等级(1,2,4).

我想显示一个位置的最新评级记录.我能以某种方式使用相关管理器在模板中执行此操作吗

我的愿景是:

all_locs = Location.objects.all()
Run Code Online (Sandbox Code Playgroud)

然后在模板中:

{% for location in all_locs %}
   {{ location.locations_rate.latest }}
{% endfor %}
Run Code Online (Sandbox Code Playgroud)

相关经理可以做这种事吗?

python database django django-related-manager

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

在模板中显示上传的图像 - Django

我正在尝试将上传的图像显示到我想象中的蔬菜目录的模板中.

我有一个页面添加一个新的蔬菜和上传图像.主模板是一个蔬菜列表,稍后会有缩略图.

现在,当查看蔬菜的详细页面时,我想显示其图像,但模板只显示字符串'VegetableImage Object'代替图像,即使使用img标签.

我很困惑,因为模板显然已经找到了图像,但它们只是作为通用字符串显示.

models.py

class Vegetable(models.Model):
        title = models.CharField(max_length=0)
        category = models.CharField(max_length=50,
                                    choices=CATEGORY_CHOICES)
        thumbnail = models.ImageField(upload_to = 'uploaded_images/')


class VegetableImage(models.Model):
    vegetable = models.ForeignKey(Vegetable, default=None, related_name='images')
    image = models.ImageField(upload_to='images/vegetable',
                             verbose_name='image',)
Run Code Online (Sandbox Code Playgroud)

查看主模板(所有蔬菜的列表)和详细视图

class VegetableView(generic.ListView):
    template_name = 'vegetable/vegetable.html'
    context_object_name = 'vegetable_list'

    def get_queryset(self):
        return Vegetable.objects.all()

class DetailView(generic.DetailView):
    model = Vegetable
    template_name = 'vegetable/detail.html'
Run Code Online (Sandbox Code Playgroud)

显示菜细节的细节模板

{% if view %}
    <h1>Title: {{ vegetable.title }}</h1>
    <h2>Category: {{ vegetable.category }}</h2>
    <p>Thumbnail: {{ vegetable.thumbnail }}</p>
    <p>Images:     
{% for vegetable in vegetable.images.all %}
    {{ vegetable …
Run Code Online (Sandbox Code Playgroud)

django django-templates django-related-manager pillow

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

Django:获取特定用户的所有对象

尝试显示用户的所有Announce对象时出现问题.我的问题是:考虑我以id = 1的用户身份登录.当我去/ users/1 /它显示我的所有帖子.但问题是当我想通过转到/ users/2 /来显示id = 2的其他用户的所有帖子时,它仍然显示我的所有Announce对象,而不是id = 2的用户.

models.py

class Announce(models.Model):
    owner        = models.ForeignKey('auth.User', related_name='announces')
    created_date = models.DateTimeField(auto_now_add=True)
    body         = models.TextField(max_length=1000)
Run Code Online (Sandbox Code Playgroud)

views.py

class UserAnnouncesList(ListView):
    model = Announce
    template_name = 'myApp/user_announces_list.html'
    context_object_name = 'all_announces_by_user'

    def get_queryset(self):
        return Announce.objects.filter(owner=self.request.user)
Run Code Online (Sandbox Code Playgroud)

urls.py

urlpatterns = [
url(r'users/(?P<pk>[0-9]+)/$', views.UserAnnouncesList.as_view(), name='user_announces_list'),]
Run Code Online (Sandbox Code Playgroud)

user_announces_list.html

{% extends "account/base.html" %}

{% block content %}
{% for announce in all_announces_by_user %}
<h1>{{announce.user.username}}</h1>
    <p>{{announce.body}}</p>

{% endfor %}
{% endblock content %}
Run Code Online (Sandbox Code Playgroud)

我是否必须使用某种类似的:Announce.objects.get(pk = ???)?

我感谢您的帮助!

python django listview django-queryset django-related-manager

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

具有反向关系的Django rest框架序列化器

我有两个employeeperson模型有关系但与模型person没有关系的employee模型。

喜欢:

class Person(models.Model):
    name = models.CharField(max_length=100)
    address = models.CharField(max_length=100)

class Employee(models.Model):
    person = models.ForeignKey(Person, related_name='person_info')
    code = models.CharField()
Run Code Online (Sandbox Code Playgroud)

在这种情况下,我需要code人员序列化程序中的字段数据。


我可以使用个人模型中的编写方法或在个人序列化器中使用SerializerMethodField来解决此问题

像这样:

def get_employee_code(self):
    return Employee.objects.get(person=self).id
Run Code Online (Sandbox Code Playgroud)

并将其添加为亲自序列化器中的源

employee_code = serializers.CharField(source='get_employee_code')
Run Code Online (Sandbox Code Playgroud)

或将员工序列化程序添加到人员序列化程序中

class PersonSerializer(serializers.ModelSerializer):
    employee = EmployeeSerializer()
    class Meta:
        model = Person
        fields = ('name', 'address', 'employee')
Run Code Online (Sandbox Code Playgroud)

但是我试图用反向关系做到这一点,但我做不到。我已经尝试过这样,它给出了一个错误

序列化器:

class PersonSerializer(serializers.ModelSerializer):
    employee_code = serializers.CharField(source='person_info.code')
    class Meta:
        model = Person
        fields = ('name', 'address', 'employee_code')
Run Code Online (Sandbox Code Playgroud)

我该如何解决反向关系呢?

python django django-models django-related-manager django-rest-framework

2
推荐指数
2
解决办法
1056
查看次数