skorokithakis / django-annoying

A django application that tries to eliminate annoying things in the Django framework. ⛺
http://skorokithakis.github.io/django-annoying
BSD 3-Clause "New" or "Revised" License
918 stars 89 forks source link

AutoOneToOne doesn't work #51

Open vorlif opened 8 years ago

vorlif commented 8 years ago

System

OS: Linux Python: 3.5.1 Django: 1.9.5 Annoying: 0.9.0

Example

From README.md.

from annoying.fields import AutoOneToOneField

class MyProfile(models.Model):
    user = AutoOneToOneField(User, primary_key=True)
    home_page = models.URLField(max_length=255, blank=True)
    icq = models.IntegerField(blank=True, null=True)

Description

I have try your example but it doesnt't work. I have no error messages. The field works lika a regular OneToOne field.

pymarco commented 8 years ago

It is not working for me either.

class Alpha(models.Model):
  ...

class Beta(models.Model):
   alpha = AutoOneToOneField(Alpha, primary_key=True, on_delete=models.CASCADE)

I created an Alpha object and no corresponding Beta object was created.

skorokithakis commented 8 years ago

Hmm, can anyone see what the problem is, or submit a PR to fix it?

arthurio commented 8 years ago

@pymarco I'm just seing this but AutoOneToOneField won't create a related object unless you try to access it.

a = Alpha.objects.create()
Beta.objects.count()
# 0
a.beta
# <Beta: Beta object>
Beta.objects.count()  # 1
usunyu commented 8 years ago

@arthurio thanks, its worked for me on Django 1.10, python 2.7

littlehome-eugene commented 7 years ago

It is not working for me either.

django 1.9.7 annoying: 0.9.0

arthurio commented 7 years ago

@littlehome-eugene We are going to need more details than that to figure out what is not working for you...

moorchegue commented 7 years ago

Same here. Django 1.11.2, annoying 0.10.3.

Under some circumstances objects are being created, but what those are I haven't figured out yet.

eduardocesar commented 6 years ago

Not working for me either. Django 1.11.6, python 2.7, annoying 0.10.3.

arthurio commented 6 years ago

@eduardocesar @moorchegue I don't see how we can possibly help you without more details... Did you read my previous comment ?

eduardocesar commented 6 years ago

@arthurio I've tried to access the related object after the creation of the primary object and did not appear. With some investigation, it seems that it was a boolean field in the related object that was preventing it's creation.

sdawodu commented 6 years ago

Doesn't work for me either:

class PatientRecord(models.Model):

    checkup_interval = models.IntegerField(default=180)

class Patient(models.Model):
        name = models.CharField(max_length=64)
    # date_of_birth = models.DateField()
    record = AutoOneToOneField(PatientRecord, on_delete=models.CASCADE)

    registration_date = models.DateField()
    last_visit = models.DateField(blank=True, null=True)

    # Keep track of how many times we're sending messsages to people
    # to make sure we don't spam them
    appointment_reminder_attempt = models.IntegerField(default=0)

    email_address = models.EmailField(blank=True, null=True)

Creating a Patient object does not automatically create a PatientRecord. I've tried creating via the admin as well as via the shell. Doesn't seem to work either way.

Django==2.0 django-annoying==0.10.3

hiamandeep commented 6 years ago

@arthurio Thanks, accessing the related object creates it.

http://www.techinfected.net/2018/02/automatically-create-onetoonefield-in-django.html

albrnick commented 5 years ago

Is primary_key=True required for this to work?

My model is defined as such:

class CrmCategory(models.Model):
    stats_list_direct = AutoOneToOneField('CrmCategoryStatsList',
                                          null = True,
                                          related_name = 'direct_category',
                                          help_text = 'What stats to list, as defined by this category directly.')
    stats_list_union = AutoOneToOneField('CrmCategoryStatsList',
                                         null = True,
                                         related_name = 'union_category',
                                         help_text = 'An or''ing of the direct stats, and the children''s stats_list_union')

And yet when I access it, I get a None:

    cat = CrmCategory.objects.all().first()
    print('union',  cat.stats_list_union)
arthurio commented 5 years ago

@albrnick You want to put the AutoOneToOneField on the CrmCategoryStatsList model instead:

class CrmCategoryStatsList(models.Model):
    category = AutoOneToOneField(...)