'Django: Using Faker to fill multiple tables

I am trying to populate my Django project with some test data. I have 3 tables, Person, Address, Employment. Both Address and Employment have a Person FK. My script is creating my person but when it gets to Address it fails at Address.person

models

class Person(models.Model):
    first_name = models.CharField(max_length=200)
    middle_name = models.CharField(max_length=200)
    last_name = models.CharField(max_length=200)

class Address(models.Model):
    person = models.ForeignKey(Person, on_delete=models.CASCADE)
    address = models.CharField(max_length=200, blank=True, null=True)

class Employment(models.Model):
    person = models.ForeignKey(Person, on_delete=models.CASCADE)
    employer = models.CharField(max_length=200)

My script

def populate(n=5):
    for entry in range(n):
        person = Person.objects.get_or_create(
            first_name = fakegen.first_name(),
            middle_name = fakegen.first_name(),
            last_name = fakegen.last_name(),

    FakeAddress(person)
    FakeEmployment(person)

def FakeAddress(person):
    address = Address.objects.get_or_create(
        person = person,
        address = fakegen.street_address(),
TypeError: Field 'id' expected a number but got <Person: Michael Baker>.

I've tried to pass the Person to the address function and I get TypeError: Field 'id' expected a number but got <Person: Michael Baker>. Next I tried passing the Person's ID instead of the person and I get ValueError: Cannot assign "93": "Address.person" must be a "Person" instance.



Solution 1:[1]

get_or_create returns a tuple. Since I only need to first item in the tuple I changed

 person = Person.objects.get_or_create(
            first_name = fakegen.first_name(),
            middle_name = fakegen.first_name(),
            last_name = fakegen.last_name(),

to

        person, _created = Person.objects.get_or_create(
            first_name=fakegen.first_name(),
            middle_name=fakegen.first_name(),
            last_name=fakegen.last_name(),

Sources

This article follows the attribution requirements of Stack Overflow and is licensed under CC BY-SA 3.0.

Source: Stack Overflow

Solution Source
Solution 1 Mwheeler91